Magick++ で画像の種類を調べてみる
アップロードされた画像ファイルの種類を調べたいとき、PHP だと $_FILES の type を見て MIME が取れたりしますが、その値も信頼できないということで、exif_imagetype とかを使って本当の画像の種類を調べる必要がありそうです。
というわけで、さらに PHP でもない環境でなんかわかんないけどポツンと画像ファイルらしきものがあるとして、ImageMagick の C++ な I/F である Magick++ を使ってその種類を調べてみます。
Magick++ 自体は ImageMagick のパッケージに引っ付いてくるみたいなので、MacPorts だとこんな感じでまずインストール。+jpeg2 で jasper が入ります。
-
[ihara@barcelona.local:~] $ port list | grep -i imagemagick
-
ImageMagick @6.3.5-6 graphics/ImageMagick
-
[ihara@barcelona.local:~] $ port variants ImageMagick
-
ImageMagick has the variants:
-
universal
-
perl
-
gs
-
lcms
-
wmf
-
mpeg
-
jbig
-
jpeg2
-
graphviz
-
no_x11
-
no_plus_plus
-
darwin_6
-
darwin_8
-
[ihara@barcelona.local:~] $ sudo port install -dv ImageMagick +jpeg2
で、Magick++ を使って書いてみた magickpp.cc。
-
#include <iostream>
-
#include <vector>
-
#include <Magick++.h>
-
-
using namespace std;
-
-
int main(int argc, char* argv[]) {
-
char* files[] = {"/Users/ihara/work/jpeg.jpg", // JPEG
-
"/Users/ihara/work/jpeg2000.jp2", // JPEG 2000
-
"/Users/ihara/work/gif.gif", // GIF
-
"/Users/ihara/work/animgif.gif", // Animation GIF
-
"/Users/ihara/work/png.png", // PNG
-
"/Users/ihara/work/magickpp", // 存在しないファイル
-
"/Users/ihara/work/magickpp.cc"}; // このソースファイル
-
for (unsigned int i = 0; i <sizeof(files) / sizeof(files[0]); i++) {
-
try {
-
vector<Magick::Image> imageList;
-
Magick::readImages(&imageList, files[i]);
-
const string& magick = imageList[0].magick();
-
if (magick != "GIF") {
-
cerr <<files[i]
-
<<": "
-
<<magick
-
<<endl;
-
} else {
-
if (imageList.size() == 1) {
-
cerr <<files[i]
-
<<": "
-
<<magick
-
<<endl;
-
} else {
-
// アニメーション GIF はエラーとする
-
cerr <<"ERROR: "
-
<<files[i]
-
<<": animation gif, frame size: "
-
<<imageList.size()
-
<<endl;
-
}
-
}
-
} catch (const Magick::Exception& e) {
-
cerr <<"ERROR: "
-
<<files[i]
-
<<": "
-
<<e.what()
-
<<endl;
-
}
-
}
-
return 0;
-
}
Magick::readImages() で画像を読み込んで、フレームが 2 つ以上ある GIF はエラーにしています。
で、ビルド。C なら Magick-config、C++ なら Magick++-config ってツールで必要なコンパイルオプションを出力してくれます。g++ ならこんな感じ。
-
[ihara@barcelona.local:~/work] $ g++ `Magick++-config --cppflags` `Magick++-config --ldflags --libs` magickpp.cc
できた a.out を実行してみます。
-
[ihara@barcelona.local:~/work] $ ./a.out
-
/Users/ihara/work/jpeg.jpg: JPEG
-
/Users/ihara/work/jpeg2000.jp2: JP2
-
/Users/ihara/work/gif.gif: GIF
-
ERROR: /Users/ihara/work/animgif.gif: animation gif, frame size: 6
-
/Users/ihara/work/png.png: PNG
-
ERROR: /Users/ihara/work/magickpp: ImageMagick: unable to open image `/Users/ihara/work/magickpp': No such file or directory
-
ERROR: /Users/ihara/work/magickpp.cc: ImageMagick: no decode delegate for this image format `/Users/ihara/work/magickpp.cc'
フレームのサイズが 6 な animgif.gif(5 行目)や、存在しないファイル(7 行目)、テキストファイル(8 行目)はエラーになっています。
identify 叩けばさくっと終わる話なんですけどね。

No comments
Jump to comment form | comments rss [?] | trackback uri [?]