在 PHP 中更改图像的不透明度
Posted
技术标签:
【中文标题】在 PHP 中更改图像的不透明度【英文标题】:Change the opacity of an image in PHP 【发布时间】:2013-01-06 06:21:13 【问题描述】:我正在尝试使用 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);
谢谢!
【问题讨论】:
我不确定,但这只是不打电话给imagealphablending
(或imagesavealpha
)的问题吗?
快速搜索后,可能重复:***.com/questions/5529306/…
你试过用 CSS 改变不透明度吗?
@abarnert 是的,我认为这可能与它有关,我尝试弄乱这些功能,但到目前为止没有运气。我会看看另一个问题。
@JohnDoe 使用 CSS 更改不透明度不是我想要做的,我正在尝试使用 php 更改它,以便我可以再次保存图像。
【参考方案1】:
您只需将imagefilter
与IMG_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
。
【讨论】:
实验表明,imagealphablending
和 imagesavealpha
值都不会影响透明和不透明图像的 imagefilter
结果。也许它们会影响imagepng
结果。【参考方案2】:
没有直接的方法可以使用 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 );
【讨论】:
确实有。看看我的回答 如果你有圆形图像,那么它会在新图像中转换为方形。所以它不能正常工作。 @AjayBhayani,你说的“圆形图像”是什么意思?如果您指的是具有透明角的图像,那么您在某处会出错,因为此代码考虑了原始图像的透明度。【参考方案3】:您是否尝试将 alpha 混合设置为 true?
imagealphablending($newImage,true);
【讨论】:
以上是关于在 PHP 中更改图像的不透明度的主要内容,如果未能解决你的问题,请参考以下文章