php - 使用PHP的GDlib imagecopyresampled时可以保留PNG图像透明度吗?

标签 php png transparency gd alpha

以下 PHP 代码片段使用 GD 将浏览器上传的 PNG 大小调整为 128x128。它工作得很好,除了在我的例子中原始图像中的透明区域被替换为纯黑色。

尽管设置了 imagesavealpha,但还是有些不太对劲。

在重新采样的图像中保持透明度的最佳方法是什么?

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile );    
imagesavealpha( $targetImage, true );

$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

最佳答案

imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

为我做的。谢谢 ceejayoz。

注意,目标图像需要 alpha 设置,而不是源图像。

编辑: 完整的替换代码。另请参阅下面的答案及其评论。这不能保证在任何方面都是完美的,但确实满足了我当时的需求。

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile ); 

$targetImage = imagecreatetruecolor( 128, 128 );   
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

关于php - 使用PHP的GDlib imagecopyresampled时可以保留PNG图像透明度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32243/

相关文章:

php - 如何使用 dompdf 创建多个页面

iphone - Interface Builder 中的 PNG 透明度

actionscript-3 - PNG 是否包含像 JPG 一样的 EXIF 数据?

android - Favicon 在 Android 上不显示透明度

java - 半透明窗口错误让我头疼

php - jQuery Custom添加属​​性

php - 使用 PHP zip 扩展构建的 Docker 镜像显示 "bundled libzip is deprecated"警告

php - 如何使显示的图像在php中变小

python:将base64编码的png图像转换为jpg

javascript - Threejs - 使用 MeshDepthMaterial 绘制透明纹理