注あります。ここにはtransparent PNGがあります。
次の新しいキャンバスにPNG画像を再現性と透明性を保持するサンプルコードです。ご覧のように、ピクセルレベルの操作も可能です。 custom_func($r, $g, $b)
のようなカスタム関数があります。これはこの質問の最後によく示されています。
基本的にこのコードを再作成/正常そのまま新しいキャンバスに上記画像を再描画します。 上記画像の空は完全に透明です。
$image = imagecreatefrompng('grass.png');
$x_dimension = imagesx($image);
$y_dimension = imagesy($image);
$new_image = imagecreatetruecolor($x_dimension, $y_dimension);
// create a transparent canvas
$trans_color = imagecolorallocatealpha($new_image, 0x00, 0x00, 0x00, 127);
imagefill($new_image, 0, 0, $trans_color);
for ($x = 0; $x < $x_dimension; $x++) {
for ($y = 0; $y < $y_dimension; $y++) {
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$alpha = ($rgb & 0x7F000000) >> 24;
//$pixel = custom_function($r, $g, $b);
imagesetpixel($new_image, $x, $y, imagecolorallocatealpha($image, $r, $g, $b, $alpha));
}
}
imagesavealpha($new_image, true);
imagepng($new_image, 'grass-result.png');
しかし、私は下のこの特定のPNG画像上で同じコードを実行するとき。
それは私にこのようなほとんど黒画像を提供します。
私はここに、なぜ起こっているかを理解したいと思います
?最も重要なのは、プロセスに影響を与える可能性のある要因について知りたいので、それを調べることができます。なぜ結果が1つのPNGと異なるのですか?
理想的には、元のpngイメージの透過状態(透明、半透明または不透明)を再作成されたイメージに保存して転送できるようにしたいと思います。ご覧のとおり、上記の場合を除き、私はそれを達成することができました。
私の環境です。 Windows 7 - 64ビット** Wampserver2.5 ** Apache-2.4.9 ** Mysql-5.6.17 ** php5.5.12-64b。また、ここでgetimagesize()
と画像ののvar_dumpである:ここで
array (size=6)
0 => int 228
1 => int 230
2 => int 3
3 => string 'width="228" height="230"' (length=24)
'bits' => int 8
'mime' => string 'image/png' (length=9)
UPDATE 例の画像は、透明性を維持しながら、それは、操作できることも確かに透明であることの証明です。イメージの下部がより茶色がかっていることに注目してください。これはあなたの第二の画像は、それだけで最大256色をサポートしています意味、8ビットであるこのラインのわずかな修正imagesetpixel($new_image, $x, $y, imagecolorallocatealpha($image, 100, $g, $b, $alpha));
"上の画像では空が完全に透明です。"いいえ、そうではありません。非白い背景でそれを見てみてください。 – timclutton
それはJPGです。あなたのコードはPNGを期待しています。正しいファイルをアップロードしましたか? – timclutton
SOがpngを.jpegに変換することを知らなかった。とにかく、私は証明を使って投稿を更新します。 – gurung