Exemplo n.º 1
0
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;
}