Linux(Ubuntu14)版PHP5.5でImage_Graphを使うと透過色やアルファチャネルが使えない件
前回やっとこさ、PHPのSQL 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のバージョンが、うちの環境でインストールされたものと
合ってなかった。うちでのバージョン表記はこんな感じ。
これの修正で透過色はアルファチャネルが使えるようになった。