簡體   English   中英

如何從Imager獲得Image :: Magick的Blob(原始)圖像?

[英]How to get the Image::Magick's blob (raw) image from the Imager?

如何從Imager中獲取與從Image :: MagickImageToBlob函數獲得的相同的raw data ,以獲取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');

可能使用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解碼器會使用Imager的數據正確解碼“ hello”。

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());
        }
}

我花了一點時間來測試這一點,並且發生了一些奇怪的事情。 我用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

不知道能證明什么,還是不確定是否有用,但是明天會花費更多時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM