2015-10-13 19 views
5

example image再作成PNG画像は、黒

注あります。ここには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画像上で同じコードを実行するとき。

problematic png image

それは私にこのようなほとんど黒画像を提供します。

very dark blue - almost black recreated image


私はここに、なぜ起こっているかを理解したいと思います

?最も重要なのは、プロセスに影響を与える可能性のある要因について知りたいので、それを調べることができます。なぜ結果が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));

manipulated transparent image

+0

"上の画像では空が完全に透明です。"いいえ、そうではありません。非白い背景でそれを見てみてください。 – timclutton

+0

それはJPGです。あなたのコードはPNGを期待しています。正しいファイルをアップロードしましたか? – timclutton

+2

SOがpngを.jpegに変換することを知らなかった。とにかく、私は証明を使って投稿を更新します。 – gurung

答えて

1

によって達成されました。これにより、「パレットベースの」画像になり、アルファ透明度をサポートしません。単にあなたが問題を解決することができ$imageを作成した後に次の行を追加することで

imagepalettetotruecolor($image); 

これはすでに真の色にあるイメージへの影響はありませんが、そうgrass.pngが正しく処理され続けています。 PHP manual pageから:

戻り値TRUEの変換が完了した場合、またはソースイメージがすでに真のカラー画像であれば、そうでない場合はFALSEが返されます。

+0

確かに、32kbの画像がレクリエーションで119kbになる理由は何でも構いません。 ? – gurung

+1

オリジナルの8ビットフォーマットではなく、32ビットイメージとして保存されるためです。 ['imagetruecolortopalette'](http://php.net/manual/en/function.imagetruecolortopalette.php)で操作を元に戻し、ファイルサイズを再度小さくする必要があります。 – timclutton

関連する問題