如何从Imager获取Image :: Magick的blob(原始)图像?

时间:2016-05-10 17:15:15

标签: image perl

如何从Imager获取与raw data的{​​{1}} ImageToBlob函数相同的GRAY/8bit

#Image::Magick
my $raw_magic = $im->ImageToBlob(magick => 'GRAY', depth => 8);

#Imager???  the simple 'gray' preset gives different data
my $gray = $img->convert(preset => 'gray');
$gray->write(data => \my $raw_imager, type => 'raw');

使用convert的{​​{1}}可能会有所帮助,但无法确定如何使用它。

(我需要将原始数据传递给另一个模块,该模块可以与matrix => ...一起使用 - 所以,查找如何从$raw_magic获取相同的数据。)

如果有人想玩,这是我的测试图片Imager Image::Magick 还有我的测试脚本。

qrcode.png

修改

添加一些背景信息。我想使用enter image description here包。因此,使用Image :: Magick生成的原始数据调用我的use 5.014; use warnings; use Image::Magick; use Imager; my $file = shift // 'qrcode.png'; die "missing $file" unless -f $file; #Image::Magick my $im = Image::Magick->new; $im->Read($file); my $raw_magic = $im->ImageToBlob(magick => 'GRAY', depth => 8); #hexdump($raw_magic); #Imager my $img = Imager->new; $img->read(file=>$file, type=>'png') or die 'read:', $img->errstr; my $gray = $img->convert(preset => 'gray'); $gray->write(data => \my $raw_imager, type => 'raw') or die 'write:', $gray->errstr; #hexdump($raw_imager); say "Different" if $raw_magic cmp $raw_imager; sub hexdump { my $data = shift; my $n; print $_, (++$n % 16) ? " " : "\n" for unpack '(A2)*', unpack 'H*', $data; print "\n"; } ,QR解码正确解码“hello”,使用Imager的数据不会。

decode_qr

1 个答案:

答案 0 :(得分:2)

我有一点时间来测试它,并且有一些奇怪的事情发生。我用ImageMagick创建了一个虚拟qrcode.pnm

convert -size 1x1! -depth 8 -compress none xc:black xc:white xc:gray xc:gray30 xc:gray90 +append qrcode.pnm

然后,以下代码按预期工作:

#!/usr/bin/perl
use 5.014;
use warnings;
use Image::Magick;
use Imager;

my $file = shift // 'qrcode.pnm';
die "missing $file" unless -f $file;

#Image::Magick
my $im = Image::Magick->new;
$im->Read($file);
my $raw_magic = $im->ImageToBlob(magick => 'GRAY', depth => 8);
hexdump($raw_magic);

#Imager
my $img = Imager->new;
$img->read(file=>$file,type=>'pnm') or die 'read:', $img->errstr;
my $gray = $img->convert(matrix => [[1,0,0]]);
$gray->write(data => \my $raw_imager, type => 'raw') or die 'write:', $gray->errstr;
hexdump($raw_imager);

say "Different" if $raw_magic cmp $raw_imager;

sub hexdump {
    my $data = shift;
    my $n;
    print $_, (++$n % 16) ? " " : "\n"
        for unpack '(A2)*', unpack 'H*', $data;
    print "\n";
}

<强>输出

00 ff 7e 4d e5
00 ff 7e 4d e5

不确定是什么证明,或者它是否有用,但明天会花更多时间。