Linux(Ubuntu14)版PHP5.5でImage_Graphを使うと透過色やアルファチャネルが使えない件

前回やっとこさ、PHPSQL Server接続がうまくいったんで、移行する予定のシステムを検証した。

やはり手を加えないと正常に動作しなくって、前の上司が作ったコードが
めちゃくちゃ汚いコードだからか全然動かない。ホント汚い。
scriptタグ内のjavascript部分にphpタグがそのまま出力されてたりするし。
しかも<?phpが勝手に<?で出力される!!ウケるんだけど!!

まあ、どういう対処したか忘れたけど、こういう仕様もない修正を繰り返しながら作業していた。

あるシステムでグラフを表示する機能があって、そのソースはpearでインストールするような
外部モジュール?を使っていた。
それが、Image_Graphというやつ。

今稼働中の/usr/share/phpから使ってそうなやつをrsyncでごっそり新サーバへコピー。
それでグラフ表示するページを動かしたら、gdとかいうエクステンションが必要らしい。

まあよい。手っ取り早くaptでgetする

apt-get install php5-gd
service apache2 restart

gdが入りました。これでどうや!!とページをリフレッシュすると折れ線グラフの各点の
値を表示する部分とか、グラフ内の最大、最小のエリアを表示する部分が透けてないの!!

なにそれー。意味わかんない。前回といい、何で同じコードで同じように動かないの?
JavaでもPOIとかではあったけど、そんなになかったけどなぁ。あーうっとおしい。

普通はこういうコードで透過色になったり、アルファチャネルのついた色を付けたりできるらしい。

$Marker->setBackgroundColor('');      // 透過色
$Marker->setBackgroundColor('green@0.2');      //透けた緑

@移行の数値を0.0とかにしてみたりしたけど何も変わらず。
とりあえずImage_Graphの透過色を扱う部分を、ざらっと見ていった

そしたら、このソースの部分で透過色が使える条件が書いてあった。
/usr/share/php/Image/Canvas/GD/PNG.php

60         if ((isset($param['transparent'])) && ($param['transparent']) &&
61             ($this->_gd2)
62         ) {
63             if ($param['transparent'] === true) {
64                 $transparent = '#123ABD';
65             } else {
66                 $transparent = $param['transparent'];
67             }
68             $color = $this->_color($transparent);
69             $trans = ImageColorTransparent($this->_canvas, $color);

Canvasを作る時のコンストラクタのパラメータのmapにtransparent=>trueで追加して、
_gd2がtrueでないといけないと。

transparentのパラメータはドキュメントになかったから無視した。高さと幅の指定しかなかった気がする。

_gd2がtrueになる条件はここ
/usr/share/php/Image/Canvas/GD.php

 145     function Image_Canvas_GD($param)
 146     {
 147         include_once 'Image/Canvas/Color.php';
 148 
 149         parent::Image_Canvas_WithMap($param);
 150 
 151         $this->_gd2 = ($this->_version() == 2);


修正したのはここ

1761     function _version()
1762     {
1763         $result = false;
1764         if (function_exists('gd_info')) {
1765             $info = gd_info();
1766             $version = $info['GD Version'];
1767         } else {
1768             ob_start();
1769             phpinfo(8);
1770             $php_info = ob_get_contents();
1771             ob_end_clean();
1772 
1773             if (ereg("<td[^>]*>GD Version *<\/td><td[^>]*>([^<]*)<\/td>",
1774                 $php_info, $result))
1775             {
1776                 $version = $result[1];
1777             } else {
1778                 $version = null;
1779             }
1780         }
1781 
1782 // ここ
1783         if ("1" == substr($version, 0, 1)) {
1784             return 1;
1785 // ここ 
1786         }elseif ("2" == substr($version, 0, 1)) {
1787             return 2;
1788         } else {
1789             return 0;
1790         }

まえのバージョン判断はこんな感じ。「2.1.1」とかはバージョン1と判断されてしまう。

if (ereg('1\.[0-9]{1,2}', $version)) {
	return 1;
} elseif (ereg('2\.[0-9]{1,2}', $version)) {
	return 2;
} else {
	return 0;
}

gd_info()で取得したgdのバージョンが、うちの環境でインストールされたものと
合ってなかった。うちでのバージョン表記はこんな感じ。

これの修正で透過色はアルファチャネルが使えるようになった。