使用 PHP 的 GDlib 图像复制采样时,是否可以保留 PNG 图像透明度?

2022-08-30 07:23:20

以下 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 );

答案 1
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

为我做到了。谢谢塞贾约兹

请注意,目标图像需要 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 );

答案 2

你为什么把事情搞得这么复杂?以下是我使用的内容,到目前为止,它已经为我完成了这项工作。

$im = ImageCreateFromPNG($source);
$new_im = imagecreatetruecolor($new_size[0],$new_size[1]);
imagecolortransparent($new_im, imagecolorallocate($new_im, 0, 0, 0));
imagecopyresampled($new_im,$im,0,0,0,0,$new_size[0],$new_size[1],$size[0],$size[1]);

推荐