【PHP】PNG画像の透過部分以外を白で塗りつぶす(塗りつぶしたように見える)
2017-12-01PNG画像の透過部分以外を白単色で塗りつぶします。(塗りつぶしたように見える状態にします)
前提
- PHP5、PHP7
- PHPの標準ライブラリ
GD
を使用
GDライブラリが使用可能かどうか
GDライブラリが使用可能かどうかを調べるには、phpinfo内の GD Support
の値を確認します。
enabled
であれば使用可能です。
また、ターミナル等で以下のコマンドを実行することでも確認できます。
$ php -m | grep gd
$ gd ## 使用可能であれば出力される
※ちなみに、さくらレンタルサーバーではデフォルトで使用可能なようです
GDライブラリを使用可能にする
上記の方法でGDライブラリが使用不可の状態である場合は、使用可能な状態にします。 実際に試したのは EC2(Amazon Linux)の場合のみなので、それ以外については PHPの公式ページ を確認してください。
EC2(Amazon Linux)の場合
## GDインストール (PHP7.1系の場合)
$ sudo yum install -y php71-gd
## Apache再起動
$ sudo service httpd restart
塗りつぶす処理
<?php
$file_path = "sample.png";
$after_file_path = "sample_after.png";
try
{
if (!file_exists($file_path))
{
throw new Exception('対象のファイルが存在しません。');
}
$canvas = imagecreatefrompng($file_path);
imagealphablending($canvas, false);
imagesavealpha($canvas, true);
if($canvas && imagefilter($canvas, IMG_FILTER_BRIGHTNESS, 255))
{
imagepng($canvas, $after_file_path);
imagedestroy($canvas);
$res = true;
}
else
{
throw new Exception('失敗しました。');
}
}
catch (Exception $e)
{
echo $e->getMessage();
}
タイトルで (塗りつぶしたようにみえる) と書いているとおり、上記処理では、実際に白で塗りつぶしているわけではありません。
やっていることは、透過部分以外の色がついている部分に対して、 輝度を最大にしている ということです。
処理で言うと
<?php
imagefilter($canvas, IMG_FILTER_BRIGHTNESS, 255)
の部分です。
任意の色で塗りつぶそうかと試行錯誤してみたのですが、どうもうまくいきませんでした。 今回の目的としては白一色にしたかったのでこれで大丈夫そうですが、できれば任意の色で塗りつぶしたいです。
独り言
アドベントカレンダーの季節なので、今月は ひとりアドベントカレンダー と題して、細かいネタも含めてたくさん書いていこうと思います。
comments powered by Disqus