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のオブジェクトはsetSize
とsetBackgroundColor
を指定しても空のままなので、setImageFormat
でエラーになるわけです。
今回のように新規でImagick
のオブジェクトを作成する場合には、newImage
を呼び出す必要がある。こんな具合に。
<?php $base = new Imagick(); $base->newImage($width, $height, new ImagickPixel('transparent')); $base->setImageFormat('png'); $base->clear();
前に書いたときにはmanualだかに書いてあったコードをコピペしながら使ったので問題にならなかったのかな。慣れていないときほど、うまくいってるコードを使いながらプログラムを書いていくのがさっくりと作る近道な気がする。
基本的な使い方はマニュアルのコードを参考にするのがベターかな。(確かにマニュアルの例ではnewImage
を呼び出している。)
全く脈絡もないけど、Imagick::destroy
はDeprecatedになっていた模様。代わりにImagick::clear
を使うのがよいらしい。