michimani.net

【PHP】PNG画像の透過部分以外を白で塗りつぶす(塗りつぶしたように見える)

2017-12-01

PNG画像の透過部分以外を白単色で塗りつぶします。(塗りつぶしたように見える状態にします)

前提

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