【发布时间】:2016-05-11 05:43:33
【问题描述】:
如何从Imager 获得与Image::Magick 的ImageToBlob 函数对于GRAY/8bit 相同的raw data?
#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');
使用matrix => ... 的convert 可能会有所帮助,但不知道如何使用它..
(我需要将原始数据传递给另一个模块,该模块可以与$raw_magic 配合使用——因此,寻找如何从Imager 获取相同的数据。)
如果有人想玩,这是我的测试图片qrcode.png
还有我的测试脚本。
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";
}
编辑
添加一些背景信息。我想使用Barcode::ZBar 包。因此,使用 Image::Magick 生成的原始数据调用我的decode_qr,QR-decode 会正确解码“hello”,而使用 Imager 的数据则不会。
decode_qr($raw_magic, $im->Get(qw(columns rows)), 'magick');
decode_qr($raw_imager, $gray->getwidth(), $gray->getheight(), 'imager');
sub decode_qr {
my($raw, $w, $h, $from) = @_;
path($from . '.raw')->spew_raw($raw); #save the raw data
my $zimage = Barcode::ZBar::Image->new;
$zimage->set_format('Y800');
$zimage->set_size( $w, $h );
$zimage->set_data($raw);
Barcode::ZBar::ImageScanner->new->scan_image($zimage);
for my $sym ($zimage->get_symbols) {
say join(':', $from, $sym->get_type(), $sym->get_data());
}
}
【问题讨论】:
-
看起来
Imager使用了与IM不同的灰度加权系数(0.22,0.707,0.071)。IM's“709RecLuma”看起来更接近但不完全相同。您需要绝对准确吗? -
colormatrix 看起来像是要走的路......但我现在只在手机上。