読者です 読者をやめる 読者になる 読者になる

なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

Can not process empty Imagick objectに悩まされるの巻

久しぶりにPHPからImageMagickを使ったところ罠にハマった。 ここ最近、業務でPHPを書くことがめっきりなくなってしまっているのも原因かもしれない。そうじゃないかもしれない。

<?php
$base = new Imagick();
$base->setSize($width, $height);
$base->setBackgroundColor(new ImagickPixel('transparent'));
$base->setImageFormat('png');
$base->clear();

問題となったのは、こんな感じのテストコードです。 単純に($width, $height)サイズの画像ファイルを作成して、背景が透明のキャンパスを作るイメージで作ったのですが、実行してみるとsetImageFormatの呼び出しでImagickException "Can not process empty Imagick object"が発生するのだ。

Fatal error:  Uncaught exception 'ImagickException' with message 'Can not process empty Imagick object' in ...

一見すると問題ないような気がするのですが、空の状態で作成したImageMagickのオブジェクトはsetSizesetBackgroundColorを指定しても空のままなので、setImageFormatでエラーになるわけです。

今回のように新規でImagickのオブジェクトを作成する場合には、newImageを呼び出す必要がある。こんな具合に。

<?php
$base = new Imagick();
$base->newImage($width, $height, new ImagickPixel('transparent'));
$base->setImageFormat('png');
$base->clear();

前に書いたときにはmanualだかに書いてあったコードをコピペしながら使ったので問題にならなかったのかな。慣れていないときほど、うまくいってるコードを使いながらプログラムを書いていくのがさっくりと作る近道な気がする。

PHP: 基本的な使用法 - Manual

基本的な使い方はマニュアルのコードを参考にするのがベターかな。(確かにマニュアルの例ではnewImageを呼び出している。)

全く脈絡もないけど、Imagick::destroyはDeprecatedになっていた模様。代わりにImagick::clearを使うのがよいらしい。