PHP+Imagickで色の置換

環境

PHP:7.1.2
ImageMagick:6.7.8
PECL Imagick:3.4.3

いつの間にか

Imagick::paintOpaqueImage

が非推奨になっていた。

代替関数は

Imagick::opaquePaintImage

公式マニュアルはこちら

使い方はマニュアルの通りだけど、指定した画像(image.png)の「白色を黒色に置き換えたい」という場合は

$im = new Imagick('image.png');
$im->opaquePaintImage('#ffffff', '#000000', 0, false);
$im->writeImage('image.png');

のような感じ。

全てマニュアルに書いてあるが、
第一引数:置き換え元のカラーコード、今回の場合は白色
第二引数:置き換え先のカラーコード、今回の場合は黒色
第三引数:曖昧さを表す。 JPGなど白色といっても「#ffffff」のもあるし「#fffffe」もあるような場合。 0~100で指定。 0の場合は曖昧さは無し、#ffffffのもののみ置換する。 GIFやPNGなどの画像パーツっぽいものを置換する場合には0もしくは少なめ、JPGの場合は多めが良いと思う。
第四引数:false=白色を置換、true=白色以外を置換。 通常はfalseになるはず。
第五引数:有効なチャンネル数を指定するらしい。 画像形式には疎く、今回は全く必要なかったためスルー(デフォルト値を使用)

元の「Imagick::paintOpaqueImage」とは微妙に引数が変わっているので注意が必要です。

nginx+phpで404エラーページをカスタマイズする

WEBサーバーにnginxを使用している場合、カスタム404ページを出す場合には

error_page 404 /404.html;

のように設定し、カスタムした404ページを404.htmlとして作成すれば表示されます。

ですが、phpを使用している場合

File not found. 

と表示されてしまい、カスタムされた404ページを表示することができません。

原因としてはconfファイルで

location ~ \.php$ {
    fastcgi_pass  unix:/var/run/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include       fastcgi_params;
}

のように、拡張子の末尾がphpの場合はどうする、という処理を書いているため、404検知ではなくfastcgi_passに渡って、そのパスにかかれているソフトウェアが入力スべきphpファイルがないよ、とエラーを吐いてしまう為です。

解決方法は単純で、

fastcgi_intercept_errors on;

という記述を足すだけです。

以下がphpファイルの場合でも、カスタムされた404を出す書式です。

location ~ \.php$ {
    fastcgi_pass  unix:/var/run/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include       fastcgi_params;
    fastcgi_intercept_errors on;
}