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

アルファブレンディングを有効にして、アルファを保存する必要があります。私は10秒のグーグル検索の後にこれを見つけました: http ://www.php.net/manual/en/function.imagecreatefrompng.php#43024

于 2012-05-23T11:10:50.567 に答える
3

私はこの問題を抱えていて、prehfeldtの答えは正しい考えを持っていることがわかりましたが、実際にはこれを解決するのに役立ちませんでした。アルファチャネル情報の保存を有効にする実際的な方法は、ファイルに出力する前に、画像リソースでimagesavealphaを呼び出すことです。

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

これを行わない場合、デフォルトでは、画像を保存または出力するときにGDは透明度情報を破棄します。この問題が発生しなかった理由copyは、画像処理をまったく行わずに、ファイルレベルでバイトごとにコピーするだけであるためです。

于 2016-02-20T02:31:59.100 に答える
2

ここでの問題は、GDまたはにありませんPHP

問題はPhotoshopにあります。

PNGオンになっているときにファイルを保存し、オンにRGB modeなっていないときにファイルを保存した場合Indexed 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);

(PNGの透明性は、PHPでは決して完璧ではありません)

于 2012-05-23T11:10:34.597 に答える