【问题标题】:How to get the Image::Magick's blob (raw) image from the Imager?如何从 Imager 获取 Image::Magick 的 blob(原始)图像?
【发布时间】:2016-05-11 05:43:33
【问题描述】:

如何从Imager 获得与Image::MagickImageToBlob 函数对于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 看起来像是要走的路......但我现在只在手机上。

标签: image perl


【解决方案1】:

我有一点时间对此进行了测试,但发生了一些奇怪的事情。我用 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

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

【讨论】:

  • 是的,数字看起来不错,但是magick.raw 的大小只有 529 字节,而imager.raw 则更多的是 3174 字节。我在为什么需要转换的问题中添加了更多信息。
  • 啊啊啊..终于找到解决办法了。 Imager 以 16 位/通道打开上述 png 图像。所以要获得 8 位,需要使用 my $img8 = $img->to_rgb8; 并且在我使用了你的 my $gray = $img8->convert(matrix => [[1,0,0]]); 之后。接受,因为你帮助了我。
  • @jm666 非常慷慨 - 谢谢。但是,如果您想将完整、正确的解决方案作为后代的答案并将其标记为所有人都可以看到,那很好。祝你的项目好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多