12

imagealphablending私は自分のアプリケーション(画像を保存する前に画像のサイズを動的に変更する)で動作するように透明性を確保しようとしてきましたが、とについて多くの誤った方向性を示した後、最終的に問題を絞り込んだと思いますimagesavealpha。ソース画像に適切な透明度が読み込まれることはありません。

// With this line, the output image has no transparency (where it should be
// transparent, colors bleed out randomly or it's completely black, depending
// on the image)
$img = imagecreatefromstring($fileData);
// With this line, it works as expected.
$img = imagecreatefrompng($fileName);

// Blah blah blah, lots of image resize code into $img2 goes here; I finally
// tried just outputting $img instead.

header('Content-Type: image/png');
imagealphablending($img, FALSE);
imagesavealpha($img, TRUE);
imagepng($img);

imagedestroy($img);

ファイルから画像をロードすることは、アーキテクチャ上深刻な問題になります。このコードは、iPhoneアプリからクエリされるJSON APIで使用されており、この場合、POSTデータでbase64でエンコードされた文字列として画像をアップロードする方が簡単です(より一貫性があります)。どういうわけか画像をファイルとして保存する必要がありますか(PHPが画像を再びメモリにロードできるようにするため)?$fileDataに渡すことができるストリームを作成する方法はありimagecreatefrompngますか?

4

3 に答える 3

6

Blech、これは最終的に、画像のアップロードを検証していた完全に別個のGD呼び出しが原因であることが判明しました。imagealphablendingそのコードに追加するのを忘れたimagesavealphaのですが、新しいイメージを作成してから、サイズ変更コードに渡されていました。とにかくどちらを変更する必要があります。文字列をファイル名に変換する優れた方法を提供してくれたgoldenparrotに感謝します。

于 2012-08-29T16:41:01.920 に答える
6

このコードを使用できます:

$new = imagecreatetruecolor($width, $height);

// preserve transparency

imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127));

imagealphablending($new, false);

imagesavealpha($new, true);

imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h);

imagepng($new);

imagedestroy($new);

それはあなたのために透明な画像を作ります。幸運を !

于 2013-12-09T04:05:30.177 に答える
2

どういうわけか画像をファイルとして保存する必要がありますか(PHPが画像を再びメモリにロードできるようにするため)?

いいえ。

ドキュメントによると:

data://phpv5.2.0のプロトコルを使用できます

例:

// prints "I love PHP"
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
于 2012-08-29T15:43:00.693 に答える