首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当使用PHP的GDlib图像拷贝采样时,PNG图像的透明度能被保留吗?

当使用PHP的GDlib图像拷贝采样时,PNG图像的透明度能被保留吗?
EN

Stack Overflow用户
提问于 2008-08-28 13:23:33
回答 8查看 98.7K关注 0票数 109

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

即使设置了imagesavealpha,还是有些地方不太对劲。

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

代码语言:javascript
复制
$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 );
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-08-28 13:41:13

代码语言:javascript
复制
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

都是为了我。谢谢你。

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

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

代码语言:javascript
复制
$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 );
票数 211
EN

Stack Overflow用户

发布于 2008-11-14 23:22:35

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

代码语言:javascript
复制
$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]);
票数 22
EN

Stack Overflow用户

发布于 2011-01-07 01:57:02

一个可能对某些人有帮助的附加内容:

可以在构建图像时切换图像混合。在我需要这个的具体情况下,我想把一些半透明的PNG组合在一个透明的背景上。

首先,将imagelphabling值设置为false,并用透明色填充新创建的真彩色图像。如果imagelphabling值为true,则不会发生任何事情,因为透明填充将与黑色默认背景合并,并导致黑色。

然后,将imagelphabling值切换为true,并将一些PNG图像添加到画布中,使一些背景可见(即。而不是填充整个图像)。

结果是一个具有透明背景的图像和几个组合的PNG图像。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档