ImageMagickのupdate

CentOS 6.10ではImageMagickが6.7と古いままなので6の最終である6.9にしようとすると、検索でヒットするこちらではインストールできない
yum install --enablerepo=remi ImageMagick ImageMagick-devel ImageMagick-perl

6の指定が必要
yum install --enablerepo=remi ImageMagick6 ImageMagick6-devel ImageMagick6-perl

7なら
yum install --enablerepo=remi ImageMagick7 ImageMagick7-devel ImageMagick7-devel

ImageMagickの変換エラー

Windows7(64bit)の開発環境下で、PDFファイルを画像化する際に、 **** Warning: can't process font stream, loading font by the name. **** Error reading a content stream. The page may be incomplete. (以下略)なエラーが出ることが増えました。 単に作りの悪いPDFファイルだな-と思っていたのですが、どうやらGhostScriptが古いのが原因な感じらしい。 バージョンを確認すると9.0.2、これは2011年版のもの。 ずーっと放置していたんですね。 ということで、GhostScriptのみ最新の9.27に更新してみました。 結果、エラーが表示されず変換が可能になりました。 PDFのフォーマットも地味に改変(改悪)されていますので、これに対応するには当然古いままではダメですね。 ImageMagickも古いままで止まっていますが、更新することでどこまで影響が出るのか不明ですので、無理に更新するのは止めておきます。 タイトルではImageMagickと書きましたが、実際にはGhostScriptですね。ま、いいや。

ImageMagickで画像の情報を得る

画像のいろんな情報を得るには、
identify -verbose
とするわけですが、
解像度を取得しようとコードを書いていたところ、ちょっとおかしな個所を見つけたので調べてみました。

まず、解像度は
「Resolution」
で取得できます。
最初はこれだけ見ていたのですが、実際のものと違うことがあったので悩んでいました。

よくみると
「Units」
という項目があり、これで単位を指定していることが判明。
通常は
「PixelsPerInch」
インチを基準にしていてDPIやPPIと言われるもので、
これであればResolutionはそのままDPIとなります。

次に
「PixelsPerCentimeter」
これが曲者でした。
インチとセンチを換算する必要があります。
1cm = 1inch / 2.54
なので、
[pixel/inch] = [pixel/cm] * 2.54
というわけです。

ちなみに
「Undefined」
はどういうものかよくわかりませんが、Resolutionは100が多いようです。

ImageMagickが壊れた?

WindowsVistaにインストールしてあるImageMagick6.3.2 Q8をPerlから呼び出すときのお話です。
少しの間、開発を停止していた部分を手直しすることになって画像を生成する部分が正常に動かなくなっていました。
ログをみると次のようなエラーが表示されていました。

Can't load 'C:/Perl/site/lib/auto/Image/Magick/Magick.dll' for module Image::Magick: load_file:再帰が深すぎます。スタックがオー
バーフローしました。 at C:/Perl/lib/DynaLoader.pm line 230,  line 855.


呼び出し元も、呼び出し先も階層がそんなに深いわけでもなく、動いていたときのままです。
何かのパッチでおかしくなったのかもしれないです。
そういえば、最近CPANの一括updateをしたような・・・
いろいろ調べてみましたが、これだという原因は見つかりませんでした。

結局、ImageMagickを一度アンインストールしてから入れなおしたところ、正常に動作しました。
ちなみに、上書きで更新した場合は同じメッセージが表示されて動きませんでした。
お仕事用のシステムなので、ヒヤヒヤしました。ほっと一安心です。

イラレと同じ大きさの画像を作る

ImageMagickでEPSを背景なしのpngにする方法があったけど、やり方をすっかり忘れてしまったので、GostScriptにお願いすることに。

・イラストレータで見た大きさと同じ画像に変換するには「-r72」のおまじない
・背景を透明にするには「-sDEVICE=pngalpha」のおまじない

を唱えよう

gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pngalpha -dEPSCrop -r72 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=output.png input.eps

Windowsの場合はgsではなくgswin32cになります。

Perl:PerlMagickのannotateでrotateを指定する場合

図形をrotate する場合は普通に左下が始点だけど、

annotateのパラメータとしてrotateを使う場合は、

左のベースラインが基準になるので、微妙な位置に描かれてしまう。

ベースラインは文字の高さの12.5%の位置。つまり72ptなら

72 * 0.125 = 9

左下から9ptの位置になる。

しかしここを基準に回転させるので実際には、

72  – 9 = 63

63pt分、上にシフトさせてやれば希望の位置に収まる。