Ticket #2516 (closed バグ指摘: 修正済)

Opened 6 years ago

Last modified 6 years ago

透過png画像の背景が真っ黒になってしまう

Reported by: kimoto Owned by: somebody
Priority: Milestone: EC-CUBE2.13.3
Component: 管理画面 Version: 2.13.1
Keywords: Cc:
修正済み: yes

Description

 http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=14392&forum=8&post_id=64617#forumpost64617

こんにちは今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

png_grayscale_alpha.png Download (8.6 KB) - added by snitta 6 years ago.
アルファチャンネル付きグレースケール
png_truecolor_alpha.png Download (12.4 KB) - added by snitta 6 years ago.
アルファチャンネル付きトゥルーカラー
png_indexed_trns.png Download (3.6 KB) - added by snitta 6 years ago.
インデックスカラー + tRNSチャンク
png_truecolor_trns.png Download (5.6 KB) - added by snitta 6 years ago.
トゥルーカラー + tRNSチャンク
fix-gdthumb-png.patch Download (892 bytes) - added by snitta 6 years ago.
アルファチャンネル付きPNG対応パッチ

Change History

comment:1 Changed 6 years ago by Seasoft

この現象は、サーバーによって発現の有無が異なっていたと記憶しております。GD のバージョンに絡みがあるのではないかと見ております。

引用のソースは、透過色が他の色だった場合の動作が気になります。

また、透過 PNG は、PNG-8 以外に、PNG-32 もありますのでご留意ください。

Changed 6 years ago by snitta

アルファチャンネル付きグレースケール

Changed 6 years ago by snitta

アルファチャンネル付きトゥルーカラー

Changed 6 years ago by snitta

インデックスカラー + tRNSチャンク

Changed 6 years ago by snitta

トゥルーカラー + tRNSチャンク

comment:2 Changed 6 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

Changed 6 years ago by snitta

アルファチャンネル付きPNG対応パッチ

comment:3 Changed 6 years ago by snitta

アルファチャンネル付きのPNGについての調査結果です。 gdthumb.php はアルファチャンネル付きPNGに対応していない事が分かりました。 本件の問題はこれに起因するものだと思われます。

以下詳細です。gdthumb.php では透過処理を行うかどうかを imagecolortransparent($src_im) の戻り値が -1 かどうかで判定しています。この関数はアルファチャンネル付きのカラータイプでも -1 が返るため、透過色なしと判定されていました。libgd のソースを読むとtRNSチャンクの値だけを使用している(?)ので、同チャンクが存在しないカラータイプについての判定が別途必要みたいです。

これを踏まえてパッチを作成しました。問題がないかよろしければ試していただけますでしょうか?

attachment:fix-gdthumb-png.patch Download

アルファチャンネルの判定にはIHDRチャンクからカラータイプを取得して行っています。他に使えそうな関数がありましたら教えて下さい。

comment:4 Changed 6 years ago by snitta

追伸です。

フォーラムのパッチの場合はtRNSチャンクを使用するPNGで期待通りの透過がされなくなります。

comment:5 Changed 6 years ago by yomoro

  • 修正済み set

r23444r23445 にてコミット完了

comment:6 Changed 6 years ago by snitta

yomoro 様 検証とコミットありがとうございます。 comment:2 の問題が解消された事を確認できました。

comment:7 Changed 6 years ago by h_yoshimoto

  • Milestone changed from EC-CUBE2.13.2 to EC-CUBE2.13.3

comment:8 Changed 6 years ago by shinichi_takahashi

  • Status changed from new to closed
  • Resolution set to 修正済

snitta様 yomoro様

ご対応ありがとうございます。 動作確認ができましたので、クローズさせていただきます。

Note: See TracTickets for help on using tickets.