Ticket #2516 (closed バグ指摘: 修正済)
透過png画像の背景が真っ黒になってしまう
Reported by: | kimoto | Owned by: | somebody |
---|---|---|---|
Priority: | 中 | Milestone: | EC-CUBE2.13.3 |
Component: | 管理画面 | Version: | 2.13.1 |
Keywords: | Cc: | ||
修正済み: | yes |
Description
こんにちは今EC-CUBEを使って開発をさせて頂いているのですが、透過pngをアップロードする際に透過部分が真っ黒になってしまうバグがありました。gdthumb.phpでの画像編集時の処理を修正したら解決できたので、共有させて頂きます。 $ php -v PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies $ git diff diff --git a/data/module/gdthumb.php b/data/module/gdthumb.php index 5d6afc8..2ab7d46 100644 --- a/data/module/gdthumb.php +++ b/data/module/gdthumb.php @@ -231,7 +232,8 @@ class gdthumb { $src_im = imageCreateFromPNG($path); - $colortransparent = imagecolortransparent($src_im); + $black = imagecolorallocatealpha($src_im, 0, 0, 0, 127); + $colortransparent = imagecolortransparent($src_im, $black); if ($colortransparent > -1) { $dst_im = $imagecreate($re_size[0], $re_size[1]); imagepalettecopy($dst_im, $src_im); 上のコードのように imagecolortransparent関数の第2引数にimagecolorallocatealphaを使った透過の色を指定する事で修正できました。
Attachments
Change History
comment:2 Changed 9 years ago by snitta
アルファチャンネル付きのPNGで透過処理が出来ないようです。 gdthumb.php の判定に問題があるように思えますのでもう少し調べてみます。 テストに使用したファイルも添付しておきます。
$ identify -verbose png_*.png | grep -e 'Image:\|Type:\|alpha:\|tRNS' Image: png_grayscale_alpha.png Type: GrayscaleAlpha alpha: 8-bit Image: png_indexed_trns.png Type: PaletteAlpha alpha: 1-bit png:tRNS: chunk was found Image: png_truecolor_alpha.png Type: PaletteAlpha alpha: 8-bit Image: png_truecolor_trns.png Type: PaletteAlpha alpha: 1-bit png:tRNS: chunk was found
comment:3 Changed 9 years ago by snitta
アルファチャンネル付きのPNGについての調査結果です。 gdthumb.php はアルファチャンネル付きPNGに対応していない事が分かりました。 本件の問題はこれに起因するものだと思われます。
以下詳細です。gdthumb.php では透過処理を行うかどうかを imagecolortransparent($src_im) の戻り値が -1 かどうかで判定しています。この関数はアルファチャンネル付きのカラータイプでも -1 が返るため、透過色なしと判定されていました。libgd のソースを読むとtRNSチャンクの値だけを使用している(?)ので、同チャンクが存在しないカラータイプについての判定が別途必要みたいです。
これを踏まえてパッチを作成しました。問題がないかよろしければ試していただけますでしょうか?
attachment:fix-gdthumb-png.patch
アルファチャンネルの判定にはIHDRチャンクからカラータイプを取得して行っています。他に使えそうな関数がありましたら教えて下さい。
Note: See
TracTickets for help on using
tickets.
この現象は、サーバーによって発現の有無が異なっていたと記憶しております。GD のバージョンに絡みがあるのではないかと見ております。
引用のソースは、透過色が他の色だった場合の動作が気になります。
また、透過 PNG は、PNG-8 以外に、PNG-32 もありますのでご留意ください。