1

我将在整个过程中使用这些变量:

$ROOTDIR = $_SERVER["DOCUMENT_ROOT"];
$ROOTFILE = "http://www.scottandjessiecooper.com/webtutorials/images/smiley.png";
$NEWFILE = "$ROOTDIR/images/tmp/new_smiley.png";

当我使用此功能时,透明度没有问题

function save_image($root, $saveto){
    copy($root, $saveto);
}
save_image( $ROOTFILE, $NEWFILE ); // root can be file or url

但是我需要使用IMAGE_RESOURCE所以如果需要我可以操作ROOTFILE

所以我这样做了:

if ( file_exists( $NEWFILE ) ) unlink ($NEWFILE);
$image = imagecreatefrompng( $ROOTFILE );
imagepng( $image, $NEWFILE );
imagedestroy( $image );

现在当我使用这个时:

<img src="<?=$NEWFILE?>" />

我失去了透明度。背景变黑了!

所以我尝试输出图像以确保不是保存导致问题:

if ( file_exists( $NEWFILE ) ) unlink ($NEWFILE);
$image = imagecreatefrompng( $ROOTFILE );
header('Content-Type: image/png');
imagepng( $image );
imagedestroy( $image );

还是没用...

帮助?

4

5 回答 5

5

您需要启用 Alpha 混合并保存 Alpha。我在 10 秒的谷歌搜索后发现了这个: http ://www.php.net/manual/en/function.imagecreatefrompng.php#43024

于 2012-05-23T11:10:50.567 回答
3

我遇到了这个问题,发现 prehfeldt 的回答有正确的想法,但实际上并没有帮助我解决这个问题。启用保存 alpha 通道信息的实用方法是在将图像资源输出到文件之前调用imagesavealpha :

imagesavealpha($image, true);
imagepng( $image, $NEWFILE );

如果不这样做,默认情况下 GD 会在您保存或输出图像时丢弃透明度信息。没有对您造成此问题的原因copy是它在文件级别进行了简单的逐字节复制,根本没有经过任何图像处理。

于 2016-02-20T02:31:59.100 回答
2

这里的问题不在于GDPHP

问题出在 Photoshop 中。

如果您在打开而不是打开时保存PNG文件。RGB modeIndexed mode

于 2015-11-03T10:59:07.527 回答
1

这有帮助吗?

$info = getimagesize("smiley.png");
$image = imagecreatefrompng("smiley.png");
$image_new = imagecreatetruecolor($info[0],$info[1]);       
if ( ($info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG) ) {
  $trnprt_indx = imagecolortransparent($image);   
  if ($trnprt_indx >= 0 ) {   
     $trnprt_color    = imagecolorsforindex($image, $trnprt_indx);   
     $trnprt_indx    = imagecolorallocate($image_new, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);   
     imagefill($image_new, 0, 0, $trnprt_indx);   
     imagecolortransparent($image_new, $trnprt_indx);
  }
  elseif ($info[2] == IMAGETYPE_PNG) {
     imagealphablending($image_new, false);   
     $color = imagecolorallocatealpha($image_new, 0, 0, 0, 127);   
     imagefill($image_new, 0, 0, $color);   
     imagesavealpha($image_new, true);
   }
}
imagecopy($image_new,$image,0,0,0,0,$info[0],$info[1]);
imagepng($image_new,"smiley2.png");
于 2012-05-23T11:44:50.083 回答
0

如果背景为黑色,请尝试以下操作:

$black = imagecolorallocate($im, 0, 0, 0); 
// Make the background transparent 
imagecolortransparent($im, $black);

(通过 PHP,PNG 的透明度从来都不是完美的)

于 2012-05-23T11:10:34.597 回答