[PERL]Bild im Arbeitsspeicher verarbeiten


swas

Mitglied
Hallo Leute,

ich hoffe ich bekomme das jetzt halbwegs richtig geschildert, da es nicht ganz so einfach ist. Vorab als kleine Info ich benutze Linux und wollte versuchen eine Ramdisk zu vermeiden.

Mein Plan ist es von einer Kamera ein Bild zu ziehen auf dem ein Barcode ist. Anschließend soll der Barcode decodiert werden.
Ich wollte es mir ersparen, das Bild auf der Festplatte zu speichern und dann wieder einzulesen um es auszuwerten. Aber irgendwie klappt das nicht ganz so wie ich mir das vorgestellt hatte... Als Decoder nehme ich den "ZBar barcode reader".
Im Wiki von ZBar steht ein Beispiel zu Perl, da wird ein Bild mit Image::Magick eingelsen und an ZBar übergeben. Das Beispiel könnt ihr hier finden.

Ich habe das jetzt ganz blauäugig übernommen und wie folgt umgesetzt. Hab mir mal erlaubt ein JPG von Tutorials einzusetzen, damit man es besser testen kann:
Perl:
#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
use LWP::Simple;

my $imgData = get('http://style.tutorials.de/v10/terrashop-slim_april2012.jpg');

print "Lese Bild...\n";

my $image = Image::Magick->new;
my $cnt = $image->read($imgData);

print "$cnt Bilder gelesen\n";

print "Erzeuge Bild.. \n";

$cnt = $image->write('./test/magick.jpg');

print "$cnt Bilder erzeugt\n";
Wenn ich das jetzt ausführe bekomme ich einen Fehler beim Lesen des Bildes. Der Fehler lautet:
Code:
Read Exception 420: no decode delegate for this image format `????' @ error/constitute.c/ReadImage/532 images.
Wenn ich das Bild zuerst auf die Festplatte speichere und dann einfach einlese funktioniert es.

Hat jemand evtl. eine Idee wie ich dieses Problem Lösen könnte?

Gruß,
swas
 

deepthroat

Erfahrenes Mitglied
Hi.

Die $image->read Funktion erwartet einen Dateinamen als Argument, du kannst nicht einfach Imagedaten übergeben.

Verwende die BlobToImage Funktion:
Perl:
my $cnt = $image->BlobToImage($imgData);
 

swas

Mitglied
Um Gotteswillen.. ich Idiot :D
Die Funktion hatte ich sogar einmal im Auge gehabt aber konnte sie nicht nutzen weil ich noch das GD Modul benutzt hatte... *ausredensuch* ;)

Danke!