在PHP中更改图像的不透明度

时间:2013-01-22 21:33:57

标签: php image gd opacity transparent

我正在尝试使用GD更改图像的不透明度,我发现的几乎所有解决方案都与下面的代码类似,您可以在其中创建白色透明背景并将其与图像合并。

但是这不会使图像变得透明,图像会变得更亮,你实际上无法透视它。

所以我的问题是,如何更改图像的不透明度以便您可以查看它? 或者我这个代码做错了什么?

//Create an image with a white transparent background color
$newImage = ImageCreateTruecolor(300, 300);
$bg        = ImageColorAllocateAlpha($newImage, 255, 255, 255, 127);
ImageFill($newImage, 0, 0, $bg);

//Get the image
$source = imagecreatefrompng('my_image.png');

$opacity = 50;    

//Merge the image with the background
ImageCopyMerge($newImage,
               $source,
               0, 0, 0, 0,
               300,
               300,
               $opacity);

header('Content-Type: image/png');
imagepng($newImage);
imagedestroy($newImage);

谢谢!

3 个答案:

答案 0 :(得分:12)

您只需将imagefilterIMG_FILTER_COLORIZE

一起使用即可
$image = imagecreatefrompng('my_image.png');
$opacity = 0.5;
imagealphablending($image, false); // imagesavealpha can only be used by doing this for some reason
imagesavealpha($image, true); // this one helps you keep the alpha. 
$transparency = 1 - $opacity;
imagefilter($image, IMG_FILTER_COLORIZE, 0,0,0,127*$transparency); // the fourth parameter is alpha
header('Content-type: image/png');
imagepng($image);
我认为

imagealphablending用于绘图目的,因此您不想使用它。我可能错了。我们都应该查阅:)

如果您想使用百分比,则可以相应地计算$opacity

答案 1 :(得分:4)

使用DG功能(实际上是there is)没有直接改变不透明度的方法。但它可以使用逐像素操作来完成:

/**
 * @param resource $imageSrc Image resource. Not being modified.
 * @param float $opacity Opacity to set from 0 (fully transparent) to 1 (no change)
 * @return resource Transparent image resource
 */
function imagesetopacity( $imageSrc, $opacity )
{
    $width  = imagesx( $imageSrc );
    $height = imagesy( $imageSrc );

    // Duplicate image and convert to TrueColor
    $imageDst = imagecreatetruecolor( $width, $height );
    imagealphablending( $imageDst, false );
    imagefill( $imageDst, 0, 0, imagecolortransparent( $imageDst ));
    imagecopy( $imageDst, $imageSrc, 0, 0, 0, 0, $width, $height );

    // Set new opacity to each pixel
    for ( $x = 0; $x < $width; ++$x )
        for ( $y = 0; $y < $height; ++$y ) {
            $pixelColor = imagecolorat( $imageDst, $x, $y );
            $pixelOpacity = 127 - (( $pixelColor >> 24 ) & 0xFF );
            if ( $pixelOpacity > 0 ) {
                $pixelOpacity = $pixelOpacity * $opacity;
                $pixelColor = ( $pixelColor & 0xFFFFFF ) | ( (int)round( 127 - $pixelOpacity ) << 24 );
                imagesetpixel( $imageDst, $x, $y, $pixelColor );
            }
        }

    return $imageDst;
}

$source = imagecreatefrompng( 'my_image.png' );
$newImage = imagesetopacity( $source, 0.5 );
imagedestroy( $source );

header( 'Content-Type: image/png' );
imagepng( $newImage );
imagedestroy( $newImage );

答案 2 :(得分:0)

您是否尝试将Alpha混合设置为true?

imagealphablending($newImage,true);