2009-07-29 13 views
0

Dies ist ein Querverweis von Perl Monks und Mahalo Antworten, wo ich noch keine zufriedenstellende Antwort erhalten habe. Vielen Dank für Ihre Zeit und Geist:Was bewirkt, dass die scaleX-Methode der Imager-Klasse fehlschlägt?

Warum erhalte ich diese Fehlermeldung aus perl:

Can't call method "scaleY" on an undefined value at C:/strawberry/perl +/site/lib/ Image/Seek.pm line 137? 

ich den Fehler im Titel bekommen, wenn das Bild Aufruf :: Sucht Modul von meinem Skript. Mein Skript ist im Grunde eine Neuaufbereitung des vom Modul vorgeschlagenen Codes.

Hier ist der Fehler wieder:

Can't call method "scaleY" on an undefined value at C:/strawberry/perl +/site/lib/ Image/Seek.pm line 137. 

Hier ist mein Code:

#!/usr/local/bin/perl 
use Imager; 
use Image::Seek qw(loaddb add_image query_id savedb); 

loaddb("haar.db"); 
my $img = Imager->new("photo-1.jpg") 
or die Imager->errstr; 

# my $img = Imager->new(); 
# $img->open(file => "photo-1.jpg")or die Imager->errstr; 

add_image($img, 1); 
savedb("haar.db"); 

Hier ist der Abschnitt des Bildes :: Sucht Modul das Problem verursacht:

sub add_image_imager { 
    my ($img, $id) = @_; 
    my ($reds, $blues, $greens); 
    require Imager; 
    my $thumb = $img->scaleX(pixels => 128)->scaleY(pixels => 128); 
    for my $y (0..127) { 
     my @cols = $thumb->getscanline(y => $y); 
     for (@cols) { 
      my ($r, $g, $b) = $_->rgba; 
      $reds .= chr($r); $blues .= chr($b); $greens .= chr($g); 
     } 
    } 
    addImage($id, $reds, $greens, $blues); } 

Linie 137 ist:

my $thumb = $img->scaleX(pixels => 128)->scaleY(pixels => 128); 

Wenn ich entfernen

->scaleY(pixels => 128) 

dann Linie 129:

my @cols = $thumb->getscanline(y => $y); 

gibt mir im Wesentlichen den gleichen Fehler.

An dieser Stelle versuche ich nur ein Bild zur Datenbank hinzuzufügen. Es gibt ein Bild in dem Verzeichnis, in dem ich das Skript ausführe, um das Bild namens "photo-216.jpg" hinzuzufügen. Wenn ich den Namen in "photo-1.jpg" oder "photo-0.jpg" ändere und die entsprechenden "add_image" und "query_id" auf 1 oder 0 ändere, ist das Ergebnis dasselbe.

Ich habe eine Datenbank, die 385 KB groß ist, die aus Ausführen von makedb.pl unten kommt, aber es ist mit Null-Zeichen gefüllt. Ich habe dieses "haar.db" umbenannt. Dies ist die Datenbank, die mir den Fehler gibt. Wenn ich die haar.db Datei als eine leere neu erstellen, dann hängt das Skript und nach ein paar Minuten, es diese andere Botschaft geben:

"This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information." 

Wenn es keine „haar.db“ ist immer noch die Datei gibt mir der Fehler im Titel dieses Beitrags und im Gegensatz zum Ausführen von makedb.pl, gibt mir keine Datenbank namens "haar.db".

Übrigens bekomme ich mehrere Beispiele für Titelfehler dieses Beitrags auch beim Versuch, dieses Datenbank-Füllskript auszuführen: http://www.drk7.jp/pub/imgseek/t/makedb.pl.txt/, auf das ich schon vorher anspielte. Ich habe offensichtlich die TXT-Erweiterung entfernt, bevor ich es versuchte. Das Skript "makedb.pl" stammt von dieser japanischen Website: http://www.drk7.jp/MT/archives/001258.html.

Wenn ich makedb.pl in einem Verzeichnis von 2423 eingescannte Sammler Briefmarken Briefmarken laufen lassen, bekomme ich 362 Instanzen des Fehlers. Die 2423 Briefmarken sind die Nummer, die ich habe, nachdem ich die "kleinen" Thumbnail-Versionen entfernt habe, von denen ich ursprünglich dachte, dass sie das Problem verursachen könnten.

Könnte es sein, dass einige der Bilder weniger als 128 Pixel sind und das ist das Problem? Wenn dies jedoch wahr ist, warum wird die Datenbank mit Null-Zeichen gefüllt? ... Es sei denn, sie sind nicht wirklich null, obwohl der Editor, den ich benutze, Notebook ++, sagt, dass sie es sind.

Auch meine Bilder sind von Briefmarken, die nur manchmal perfekte Quadrate sind. Ansonsten sind sie manchmal "Landschaft", manchmal "Porträt". Vielleicht ist das Problem, wenn die "Landschaft" skalierten Bilder eine X-Achse von 128 Pixeln bekommen und dann ihre Y-Achse weniger oder viel weniger endet. Kann das sein?

Dank viel

+1

** Immer ** "' string verwenden; '" und "' Warnungen verwenden; '". –

+0

@socrtwo Ich mag die Strawberry Anstrengung, aber es scheint mir, dass Sie eine Menge Frustration vermeiden könnten, indem Sie AS Perl für jetzt verwenden. Wie auch immer, viel Glück mit Ihrem Projekt. –

Antwort

2

Update: komplett neu organisiert Antwort.

Image::Seek wird nicht überprüft, wenn scaleX Fehler zurückgegeben. In Ihrem Fall, für einige Bilder, scaleX ist fehlgeschlagen. Sie scheinen zu wissen, für welche Bilder scaleX fehlschlägt. Also, lassen Sie die aktuellen Code beiseite, und zusammen mit einem kurzen Testskript:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Imager; 

die "Specify image file name\n" unless @ARGV; 

my ($imgfile) = @ARGV; 

my $img = Imager->new; 
$img->read(file => $imgfile) 
    or die "Cannot read '$imgfile': ", $img->errstr; 

my $x_scaled = $img->scaleX(pixels => 128) 
    or die 'scaleX failed: ', $img->errstr; 

my $thumb = $x_scaled->scaleY(pixels => 128) 
    or die 'scaleY failed: ', $x_scaled->errstr; 

__END__ 

dieses Test-Scripts ausführen, erhalten Sie die Fehlermeldung:

 
Cannot read 'photo-1.jpg': format 'jpeg' not supported - formats bmp, 
ico, pnm, raw, sgi, tga available for reading 

das zugrunde liegende Problem anzeigt: Bei der Installation von Imager über Erdbeere Perl cpan, die Bibliotheken für png, jpg usw. wurden nicht installiert. Eine Lösung ist diese Bibliotheken mit dem gcc Compiler mit Strawberry Perl zu erstellen.

Zuerst benötigen Sie zlib.

 
C:\Temp\zlib-1.2.3> copy win32\Makefile.gcc Makefile 

Set prefix = /strawberry/c/local im Makefile. Kompilieren. Sie können zu kopieren Sie die Dateien manuell zlib.h und zconf.h zu C:\strawberry\c\local\include und zlib1.dll, libz.a und libzdll.a zu C:\strawberry\c\local\lib (ich weiß nicht, weil ich Strawberry Perl nicht sehr häufig verwenden, und meine Strawberry Umgebung sehr vernachlässigt.)

Dann erhalten Sie libpng. Ich habe das Quellarchiv ohne Config-Skript verwendet.

 
C:\Temp\libpng-1.2.38> copy scripts\makefile.mingw Makefile 
C:\Temp\libpng-1.2.38> make prefix=/strawberry/c/local ZLIBLIB=/strawberry/c/local/lib ZLIBINC=/strawberry/c/local/include 

Dies baute die PNG-Bibliothek. Auch hier müssen Sie möglicherweise die Dateien .dll, .a und .h manuell in die entsprechenden Verzeichnisse kopieren. Ich habe wegen meiner weniger als perfekte Erdbeer-Umgebung. Geben Sie JPEG library ein.

 
C:\Temp\jpeg-7> copy Makefile.ansi Makefile 

Stellen Sie sicher, diese Datei und CC=gcc gesetzt zu bearbeiten. Passen Sie jconfig.h entsprechend zu den Anweisungen in jconfig.txt an. Ich habe jconfig.dj als Basis verwendet.

Sie könnten auch

CFLAGS= -O2 
SYSDEPMEM= jmemansi.o 

in Makefile und

#define DEFAULT_MAX_MEM 4*1024*1024 

in jconfig.h festlegen möchten. Nachdem Sie make ausgeführt haben, kopieren Sie die Dateien erneut nach Bedarf (und wie unter install.txt erläutert).

Sobald die Bibliotheken installiert sind, können Sie

C:\Temp> SET IM_INCPATH=C:\strawberry\c\local\include 
C:\Temp> SET IM_LIBPATH=C:\strawberry\c\local\lib 
C:\Temp> cpan 
cpan> force install Imager 

, die ergibt:

 gif: includes not found - libraries not found 
    ungif: includes not found - libraries not found 
    jpeg: includes found - libraries found 
     png: includes found - libraries found 
    tiff: includes not found - libraries not found 
freetype2: includes not found - libraries not found 
freetype2: not available 
T1-fonts: includes not found - libraries not found 
TT-fonts: includes not found - libraries not found 
     w32: includes found - libraries found 

Wenn all dies zu viel Arbeit ist, ist es ... Seufzer ich nur realisiert die Binärdateien sind verfügbar unter GnuWin32.

+0

Ich bekomme diesen Fehler jetzt mit meinem benutzerdefinierten Modul: Global Symbol "$ xscaled" erfordert explizite Paketname bei C:/Erdbeere/perl/si te/lib/Image/SeekPDP.pm Linie 146. BEGIN nicht sicher nach Fehler - Kompilation abgebrochen bei C:/strawberry/perl/site/lib/ Danke für die Hilfe. Image/SeekPDP.pm Linie 161. Kompilierung fehlgeschlagen in der requiry bei processimage.pl Zeile 3. BEGIN fehlgeschlagen - Kompilierung abgebrochen bei processimage.pl Zeile 3. – socrtwo

+0

@socrtwo Ich meinte, den Code in 'Image/Seek.pm ändern '. Jedenfalls habe ich meine Antwort aktualisiert um zu klären. –

+0

Ja, ich habe den Code in Seek.pm aktualisiert. Nur um sicher zu sein, dass es kein Problem ist, habe ich es in ein benutzerdefiniertes Modul namens Image :: SeekPDP mit den von Ihnen vorgeschlagenen Änderungen geschafft. Ich habe dann das benutzerdefinierte Modul nach den Anweisungen hier installiert: http://springfield.pm.org/meetings/modules.html. Ich habe den neuen Fehler wie erwähnt bekommen. Vielen Dank für die Hilfe ... – socrtwo

Verwandte Themen