カラーモードとチャンネルbit数のまとめ

カラーモードにはCMYK・RGB・グレースケール・モノクロ(2階調)・LAB(CIELab)・インデックスカラーなどがあります。
それぞれのカラーモードの特性については、ここでは省きます。
チャンネルbitは8bit・16bit・32bitなどがありますが、カラーモードとの兼ね合いもあって1bit・2bit・4bit・6bitなども存在はするようです。
例えば、16色や256色などはカラーモードとは関係なく色数が基準のものもあります。
ここでは印刷向けに調べたものをとりあえず載せています。
カラーモードとチャンネル数はImageMagickのファイル情報を調べるコマンド「identify -verbose」を使用します。
ImageMagickのバージョンは16bit対応のもので「Version: ImageMagick 6.8.3-0 2013-02-13 Q16 http://www.imagemagick.org」です。
網羅しているわけではありませんのあしからず。

Illustratorで保存したPDF形式の場合

Illustratorではチャンネルbit数の指定はできません。
基本的には8bitとして扱われます。

CMYKカラー
Colorspace: CMYK
Depth: 16/8-bit
Type: ColorSeparation
RGBカラー
Colorspace: sRGB
Depth: 16/8-bit
Type: ColorSeparation

Photoshopで保存したPSD形式の場合

Photoshopではチャンネルbit数を指定できます。
カラー情報を持てるカラーモード(RGBやCMYKなど)の場合、編集中は16bitに上げておくのは基本中の基本ですが、完成したら必ず8bitに戻すのを忘れないようにしましょう。
特に印刷向けに入稿する場合は8bitに戻してください、お願いします。

RGBカラー(8bit)
Colorspace: sRGB
Depth: 8/1-bit
Type: PaletteAlpha
RGBカラー(16bit)
Colorspace: sRGB
Depth: 16/1-bit
Type: Palette
RGBカラー(32bit)
非対応(32bit対応のImageMaagickは存在する?)
CMYKカラー(8bit)
Colorspace: CMYK
Depth: 8/1-bit
Type: ColorSeparationAlpha
CMYKカラー(16bit)
Colorspace: CMYK
Depth: 16/1-bit
Type: ColorSeparation
グレースケール(8bit)
Colorspace: Gray
Depth: 8/1-bit
Type: Bilevel
インデックスカラー(8bit)
Colorspace: sRGB
Depth: 8/1-bit
Type: Palette

カラーモード自体はRGBなので、タイプで判定する必要があります。
ソフトによってはインデックスカラーは画像が化ける原因になりますので、インデックスカラーは省いたほうが事故を防げますね。
アニメーション対応のGIF形式は論外です。

Labカラー(8bit)
Colorspace: CIELab
Depth: 8-bit
Type: PaletteAlpha
モノクロ2階調
Colorspace: Gray
Depth: 1/8-bit
Type: Bilevel

グレースケールとはDepth(色深度)が異なるので判定できますね。

このあたりの情報を踏まえて、自前のファイル情報取得クラスの更新を行いますか。
印刷注文管理システム「POAS」でのチェックにもカラーモードを追加することにしましょう。

ImageMagickで解像度の指定がうまく行かない

PDF形式のファイルをPNG形式に変換するには、GhostScriptを使って変換しているわけですが、解像度が微妙な数値になるのが気になっていました。
例えば、350dpiを指定しても、実際には349.987dpiになるという具合です。
内部ではinchで格納しているデータをmmに変換する際の誤差なので大きな問題ではないのですが、見た目麗しくないので何とかならないのかと。

そうだ、ImageMagickで解像度の設定を更新すれば対応できるはずだということで検索。

http://aligach.net/diary/20091019.html によると
convert INFILE -size SRC_SIZE -scale TARGET_SIZE -density 350x350 \
-units PixelsPerInch OUTFILE

ということらしいけど、実際にやると「px/inch」ではなく「px/cm」になってしまう。

http://www.imagemagick.org/script/command-line-options.php#density
http://www.imagemagick.org/script/command-line-options.php#units
などによれば、

「-density」で解像度の数値と、「-units」で「PixelsPerInch」を同時に指定すればOKとあるものの、やはりだめ。

別の関数でやってみればと、
mogrify -density 350 -units PixelsPerCentimeter imagepath
でも、やはりだめ。

ちなみに、Windows上での話でバージョンは次の通り
ImageMagick 6.8.3-0 2013-02-13 Q16
環境によっては違うのかも?

PerlのImage::Magickが動かなくなっていた

Windows上で久しぶりに実行したスクリプトが、Image::Magickが見つからないとエラーを吐くようになっていた。
パス周りだろうか、EmEditorにPATHをぶっ壊されてからこんなのばっかりだ。
仕方がないので入れ直すことに。
ImageMagickからDLLを入れれば早いだろうと思ったけど、現在配布されている6.9.1はPerlの対応バージョンが5.20になっていて、今の5.12とは異なるので入れられない。
Perlを入れ直すのも面倒だし、他のところで問題が出そうなのでパス。
cpanからは相変わらず入れられない。
そうだ、ppmがあった。

ppm install http://www.bribes.org/perl/ppm/Image-Magick.ppd
Downloading Image-Magick-6.8.3...done
Unpacking Image-Magick-6.8.3...done
Generating HTML for Image-Magick-6.8.3...done
Updating files in site area...done
 157 files installed

これで呼び出せるようになって、動くようになった。
めでたしめでたし。

ImageMagickでEPSに変換したファイルをIllustrator CS5で開くとフリーズする問題

ImageMagickのconvertコマンドでJPEG形式の画像ファイルををEPSファイルに変換したものを、Illustrator(イラストレータ) CS5で開くと、CS5が固まる問題を調査しました。
この現象を確認したのは、CentOS上で変換したJEPGファイルです。
昔はこんなことは無かった気がしますが、いつの間にかこの問題が発生していたので調査しました。

開発環境:
Windows7(64bit)
mageMagick 6.8.3-0 2013-02-13 Q16
Illustrator CS5

本番環境:
CentOS Linux 5.11
ImageMagick 6.2.8 05/07/12 Q16

CentOS上のImageMagickでJPEGファイルをEPSファイルにconvertしたものをイラレCS5で開くとイラレが固まって強制終了するしかなくなります。
単純に変換するときのコマンドです。
convert a.jpg a.eps

環境それぞれで生成されたEPSファイルを比較しました。
本番環境で生成したファイルにはヘッダ情報に

%begin_xml_code
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:A379835BBF2068118A6DF5258C3E39CC" xmpMM:DocumentID="xmp.did:660D7D5C2F0F11E3A9DB9D247D1C6687" xmpMM:InstanceID="xmp.iid:660D7D5B2F0F11E3A9DB9D247D1C6687" xmp:CreatorTool="Adobe Photoshop CS5.1 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:A56F4D9AC92068118A6DF5258C3E39CC" stRef:documentID="xmp.did:A379835BBF2068118A6DF5258C3E39CC"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>
%end_xml_code

というものが追加されていました。
MACのフォトショCS5.1で保存されたとの記載を確認できます。
簡単に言うとファイル情報ですね。
これを削除するとイラレは固まらずにファイルを開けます。
よ~くソースを見ると、
「%begin_xml_code」と「%end_xml_code」に挟まれた行、XMLで言うところの「<?xpacket />」がベタで書かれていました。
この行、ソースとしてはベタで書かれていてちょっと引っかかったので、行をコメントアウト、つまり先頭に「%」を追加すると、イラレで固まらなくなりました。

XMLをPostScriptにベタで書いているので構文エラーで固まっていたようです。
PostScriptにはヒアドキュメントはなかった気がするので、stremaとしてデータとして埋め込むか、1行ずつコメントアウトしてやらないとだめなのでしょう。

XML情報は特に必要がないので、除去するオプション「-strip」を追加してconvertしてみます。
convert a.jpg -strip a.eps
これでファイル情報が格納されなくなり、イラレで無事開けるようになりました。

ファイル情報が埋め込まれるかどうかはコンパイル時のスイッチ設定だとは思うのですが、そこまでガッツリ調べるのが面倒なので、回避方法を確認したところで良しとします。

でめたしでめたし。

ImageMagickで画像の情報を得る

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

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

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

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

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

ネット印刷受注システムPOASにPSD入稿を実装

ネット印刷受注システムPOASで、PhotoshopのPSD形式に対応しました。
拡張機能となりますので、別途契約が必要になります。
現在使える状態になっていますが、近いうちに判定機能を追加します。

機能の概要としては、
レイヤを合成して画像化します。
解像度を調べて仕上サイズを推測します。
PSDファイルのまま入稿できます。

プリントライで問い合わせがあったので、先送りにしていた機能を前倒しで導入しました。

ImageMagickの動作が重いオプション

開発環境のWindows7上では全く問題にならなかった、dissolveオプション。
明るさを調整したかったものの、brightness-contrastがバージョンの都合で使えず、modulateはコントラストだったので、白い画像を作成してdissolveで透明度を指定して合成するように調整してみた。
開発機では問題がなく、いざVPSに上げると動作が遅い、というか重い。
これは使えたもんじゃない。
まだmodulateの方がまし。
この感じだと、むりにOSのバージョン上げてImageMagickを上げても動作が遅い可能性もあるわけで、どうしたものか。
処理によってPHPとPerlが走って、結果は同じにならないと困るので、言語ごとにチューンされてるGDも少し危険な感じ。

困った困った。

CentOS5.5に最新のImageMagickをソースからインストールする

CentOS5.5のシステムをセットアップしていました。
yumからシステムを一通りアップデートしてから、PerlをCPANでモジュール群を更新したのですが、Image::Magickを入れようとしたところ、force installにしてもNOT OKとなり、インストールできませんでした。
これはImageMagickのバージョンとPerlの(コアなモジュール)バージョンとの依存の影響と思われ、Windowsの場合はImageMagickとActivePerlのバージョンは細かく指定されています。
Linuxの場合は自動で依存を解消してくれるものと思っていましたが、どうやらダメだったようです。
ImageMagickのために、別のディストリを入れなおすことも考えましたが、それではあまりにも情け無いので、だめもとで手動でソースからコンパイルしてインストールに挑戦しました。

まずはソースの取得


[root@localhost ~]# wget ftp://ftp.kddilabs.jp/graphics/ImageMagick/linux/SRPMS/ImageMagick.src.rpm
--2010-07-20 15:44:05--  ftp://ftp.kddilabs.jp/graphics/ImageMagick/linux/SRPMS/ImageMagick.src.rpm
=> `ImageMagick.src.rpm'
ftp.kddilabs.jp をDNSに問いあわせています... 192.26.91.193
ftp.kddilabs.jp|192.26.91.193|:21 に接続しています... 接続しました。
anonymous としてログインしています... ログインしました!
==> SYST ... 完了しました。    ==> PWD ... 完了しました。
==> TYPE I ... 完了しました。  ==> CWD /graphics/ImageMagick/linux/SRPMS ... 完了しました。
==> SIZE ImageMagick.src.rpm ... 8747108
==> PASV ... 完了しました。    ==> RETR ImageMagick.src.rpm ... 完了しました。
長さ: 8747108 (8.3M)

100%[======================================>] 8,747,108   3.39M/s 時間 2.5s

2010-07-20 15:44:08 (3.39 MB/s) - `ImageMagick.src.rpm' へ保存終了 [8747108]

検索してヒットするサイトの中にはURLが「kddilabs」ではなく「kddlabs」とありますが、どちらでもいい(?)みたいです。こちらの環境でkddlabsはDNS解決できませんでしたがkddilabsでは通りました。

ここからsrc.rpmを取得して展開します。
コマンドなら次の通り

[root@localhost ~]# rpm -ivh –nomd5 ImageMagick.src.rpm
1:ImageMagick 警告: ユーザ cristy は存在しません – root を使用します
警告: グループ cristy は存在しません – root を使用します
########################################### [100%]
警告: ユーザ cristy は存在しません – root を使用します
警告: グループ cristy は存在しません – root を使用します

同じ階層に「_FILES」という文字が追加されたディレクトリがあるはずなので、移動します。


[root@localhost ~]# cd ImageMagick.src.rpm_FILES
[root@localhost ImageMagick.src.rpm_FILES]# ls
ImageMagick-6.6.3-0.tar.bz2  ImageMagick.spec

とりあえずビルドしてみます。


[root@localhost ImageMagick.src.rpm_FILES]# rpmbuild -ba ImageMagick.spec
エラー: ビルド依存性の失敗:
libtiff-devel は ImageMagick-6.6.3-0.i386 に必要とされています
giflib-devel は ImageMagick-6.6.3-0.i386 に必要とされています
perl-devel >= 5.8.1 は ImageMagick-6.6.3-0.i386 に必要とされています
ghostscript-devel は ImageMagick-6.6.3-0.i386 に必要とされています
djvulibre-devel は ImageMagick-6.6.3-0.i386 に必要とされています
libwmf-devel は ImageMagick-6.6.3-0.i386 に必要とされています
jasper-devel は ImageMagick-6.6.3-0.i386 に必要とされています
libtool-ltdl-devel は ImageMagick-6.6.3-0.i386 に必要とされています
lcms-devel は ImageMagick-6.6.3-0.i386 に必要とされています
librsvg2-devel は ImageMagick-6.6.3-0.i386 に必要とされています

いろいろと足らないと文句を言われました。
とりあえずyumで片っ端から入れていきます。


[root@localhost ImageMagick.src.rpm_FILES]# yum install libtiff-devel giflib-devel perl-devel ghostscript-devel djvulibre-devel libwmf-devel jasper-devel libtool-ltdl-devel lcms-devel librsvg2-devel

進捗は省略します。
最終的に次の3つが残ります。

perl-devel >= 5.8.1 は ImageMagick-6.6.3-0.i386 に必要とされています
djvulibre-devel は ImageMagick-6.6.3-0.i386 に必要とされています
jasper-devel は ImageMagick-6.6.3-0.i386 に必要とされています

まず、「perl-devel」はcentOS5.5ではperlに頭語されているらしいので不要です。
specファイルの15行目(辺り)にあるperl-develを削除またはコメントアウトします。

次に、「djvulibre-devel」はリポジトリ「RPMForge」または「Dag」を利用してインストールします。
導入方法は検索するなどして調べてください。
大量に解説サイトがあるので省略します。

最後に、「jasper-devel」は「http://dev.centos.org/centos/5/testing/i386/RPMS/」にCentOS5用のRPMがあります。他のサイトにある通常のel5.i386のrpmは依存解消できずにインストールできませんでした。

これら3つが解決すれば晴れてImageMagickのコンパイルが開始できます。


[root@localhost ImageMagick.src.rpm_FILES]# rpmbuild -ba ImageMagick.spec

かなり時間がかかります。
問題なく終われば、以下の場所にrpmが生成されます。


[root@localhost redhat]# cd /usr/src/redhat/RPMS/i386
[root@localhost i386]# ls
ImageMagick-6.6.3-0.i386.rpm            ImageMagick-devel-6.6.3-0.i386.rpm
ImageMagick-c++-6.6.3-0.i386.rpm        ImageMagick-doc-6.6.3-0.i386.rpm
ImageMagick-c++-devel-6.6.3-0.i386.rpm  ImageMagick-perl-6.6.3-0.i386.rpm
ImageMagick-debuginfo-6.6.3-0.i386.rpm

ここまで来れば(おそらく大丈夫です。


[root@localhost i386]# rpm -Uvh ImageMagick-*
準備中...                ########################################### [100%]
1:ImageMagick            ########################################### [ 14%]
2:ImageMagick-c++        ########################################### [ 29%]
3:ImageMagick-perl       ########################################### [ 43%]
4:ImageMagick-debuginfo  ########################################### [ 57%]
5:ImageMagick-devel      ########################################### [ 71%]
6:ImageMagick-c++-devel  ########################################### [ 86%]
7:ImageMagick-doc        ########################################### [100%]
[root@localhost i386]# convert -version
Version: ImageMagick 6.6.3-0 2010-07-20 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2010 ImageMagick Studio LLC
Features: 

でめたしでめたし。お疲れ様でした。

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の書籍紹介

書店で見かけたImageMagickの本です。
これからImageMagickに触れてみようという人にとっては、とっつきやすいかもしれません。
しかし、値段も馬鹿高いし、表紙も胡散臭いし、google先生と仲良しな人には、正直読むところがありません。