Image::Imlib2で画像のrawデータを取得できるようにする
Image::Imlib2のソースImlib2.xsに少し変更を加えてビルド&インストールし直せばいい。
# vi lib/Image/Imlib2.xs
で、
の下辺りに↓を追加。
あとは前回の通りImage::Imlib2をビルド&インストール。
ビルド↓
# perl Makefile.PL PREFIX=/usr
# make
インストール↓
# make install
または
# checkinstall --inspect
# rpm -ivh /usr/src/redhat/RPMS/x86_64/Image-Imlib2-2.03-1.x86_64.rpm
これでPerlから
my $img = Image::Imlib2->load('hoge.jpg');
my $blob = $img->get_data;
みたいにして$blobにrawデータを取得できるようになるはず。
ただし、圧縮したjpegそのものではなくてあくまでraw。
Imlib2はロード時に解凍、セーブ時に圧縮する仕様っぽく、Image::MagickのImageToBlobみたいにjpegそのままをメモリに受け渡すのはできないみたい。
# vi lib/Image/Imlib2.xs
で、
MODULE = Image::Imlib2 PACKAGE = Image::Imlib2 PREFIX= Imlib2_
の下辺りに↓を追加。
void
Imlib2_get_data(image)
Image::Imlib2 image
PROTOTYPE: $
PPCODE:
{
DATA32 *blob;
int width;
int height;
imlib_context_set_image(image);
width = imlib_image_get_width();
height = imlib_image_get_height();
blob = imlib_image_get_data_for_reading_only();
EXTEND(SP, 1);
PUSHs(sv_2mortal(newSVpv((const char *)blob, width * height * sizeof(DATA32))));
}
あとは前回の通りImage::Imlib2をビルド&インストール。
ビルド↓
# perl Makefile.PL PREFIX=/usr
# make
インストール↓
# make install
または
# checkinstall --inspect
# rpm -ivh /usr/src/redhat/RPMS/x86_64/Image-Imlib2-2.03-1.x86_64.rpm
これでPerlから
my $img = Image::Imlib2->load('hoge.jpg');
my $blob = $img->get_data;
みたいにして$blobにrawデータを取得できるようになるはず。
ただし、圧縮したjpegそのものではなくてあくまでraw。
Imlib2はロード時に解凍、セーブ時に圧縮する仕様っぽく、Image::MagickのImageToBlobみたいにjpegそのままをメモリに受け渡すのはできないみたい。
スポンサーサイト