function ApplyMask(&$image, $mask) { // Create copy of mask as mask may not be the same size as image $mask_resized = ImageCreateTrueColor(ImageSX($image), ImageSY($image)); ImageCopyResampled($mask_resized, $mask, 0, 0, 0, 0, ImageSX($image), ImageSY($image), ImageSX($mask), ImageSY($mask)); // Create working temp $mask_blendtemp = ImageCreateTrueColor(ImageSX($image), ImageSY($image)); $color_background = ImageColorAllocate($mask_blendtemp, 0, 0, 0); ImageFilledRectangle($mask_blendtemp, 0, 0, ImageSX($mask_blendtemp), ImageSY($mask_blendtemp), $color_background); // switch off single color alph and switch on full alpha channel ImageAlphaBlending($mask_blendtemp, false); ImageSaveAlpha($mask_blendtemp, true); // loop the entire image and set pixels, this will be slow for large images for ($x = 0; $x < ImageSX($image); $x++) { for ($y = 0; $y < ImageSY($image); $y++) { $RealPixel = GetPixelColor($image, $x, $y); $MaskPixel = GrayscalePixel(GetPixelColor($mask_resized, $x, $y)); $MaskAlpha = 127 - Floor($MaskPixel['red'] / 2) * (1 - $RealPixel['alpha'] / 127); $newcolor = ImageColorAllocateAlpha($mask_blendtemp, $RealPixel['red'], $RealPixel['green'], $RealPixel['blue'], $MaskAlpha); ImageSetPixel($mask_blendtemp, $x, $y, $newcolor); } } // don't need the mask copy anymore ImageDestroy($mask_resized); // switch off single color alph and switch on full alpha channel ImageAlphaBlending($image, false); ImageSaveAlpha($image, true); // replace the image with the blended temp ImageCopy($image, $mask_blendtemp, 0, 0, 0, 0, ImageSX($mask_blendtemp), ImageSY($mask_blendtemp)); ImageDestroy($mask_blendtemp); }
function ApplyMask(&$gdimg_mask, &$gdimg_image) { if (gd_version() < 2) { $DebugMessage = 'Skipping ApplyMask() because gd_version is "' . gd_version() . '"' . __FILE__ . __LINE__; return false; } if (version_compare_replacement(phpversion(), '4.3.2', '>=')) { $DebugMessage = 'Using alpha ApplyMask() technique' . __FILE__ . __LINE__; if ($gdimg_mask_resized = ImageCreateTrueColor(ImageSX($gdimg_image), ImageSY($gdimg_image))) { ImageCopyResampled($gdimg_mask_resized, $gdimg_mask, 0, 0, 0, 0, ImageSX($gdimg_image), ImageSY($gdimg_image), ImageSX($gdimg_mask), ImageSY($gdimg_mask)); if ($gdimg_mask_blendtemp = ImageCreateTrueColor(ImageSX($gdimg_image), ImageSY($gdimg_image))) { $color_background = ImageColorAllocate($gdimg_mask_blendtemp, 0, 0, 0); ImageFilledRectangle($gdimg_mask_blendtemp, 0, 0, ImageSX($gdimg_mask_blendtemp), ImageSY($gdimg_mask_blendtemp), $color_background); ImageAlphaBlending($gdimg_mask_blendtemp, false); ImageSaveAlpha($gdimg_mask_blendtemp, true); for ($x = 0; $x < ImageSX($gdimg_image); $x++) { for ($y = 0; $y < ImageSY($gdimg_image); $y++) { //$RealPixel = phpthumb_functions::GetPixelColor($gdimg_mask_blendtemp, $x, $y); $RealPixel = GetPixelColor($gdimg_image, $x, $y); $MaskPixel = GrayscalePixel(GetPixelColor($gdimg_mask_resized, $x, $y)); $MaskAlpha = 127 - floor($MaskPixel['red'] / 2) * (1 - $RealPixel['alpha'] / 127); $newcolor = ImageColorAllocateAlphaSafe($gdimg_mask_blendtemp, $RealPixel['red'], $RealPixel['green'], $RealPixel['blue'], $MaskAlpha); ImageSetPixel($gdimg_mask_blendtemp, $x, $y, $newcolor); } } ImageAlphaBlending($gdimg_image, false); ImageSaveAlpha($gdimg_image, true); ImageCopy($gdimg_image, $gdimg_mask_blendtemp, 0, 0, 0, 0, ImageSX($gdimg_mask_blendtemp), ImageSY($gdimg_mask_blendtemp)); ImageDestroy($gdimg_mask_blendtemp); } else { $DebugMessage = 'ImageCreateFunction() failed' . __FILE__ . __LINE__; } ImageDestroy($gdimg_mask_resized); } else { $DebugMessage = 'ImageCreateFunction() failed' . __FILE__ . __LINE__; } } else { // alpha merging requires PHP v4.3.2+ $DebugMessage = 'Skipping ApplyMask() technique because PHP is v"' . phpversion() . '"' . __FILE__ . __LINE__; } return true; }