2016-08-11 7 views
3

Ich versuche herauszufinden, wie Sie das Image::Resize Perl-Modul verwenden, um PNG-Bilder zu verkleinern. Der folgende Code tut Arbeit:Perl Image :: Resize-Modul und PNG-Bilder

 my $image = Image::Resize->new($read_path); 
     my $gd = $image->resize(1000,1000); 
     open (DISPLAY,">$write_path") || die "Cant write $write_path, Reason: $!"; 
      binmode DISPLAY; 
      if ($read_path =~ /\.jpg$/i) {   
      print DISPLAY $gd->jpeg(); 
      } elsif ($read_path =~ /\.gif$/i) {   
      print DISPLAY $gd->gif(); 
      } elsif ($read_path =~ /\.png$/i) {   
      print DISPLAY $gd->png(); 
      } 
     close DISPLAY; 

jedoch das Ergebnis nicht das, was würde Ich mag (die skalierte Version hat einen schwarzen Hintergrund, wenn Sie ein transparentes PNG konvertieren)

Original: enter image description here

Scaled:

enter image description here

Wie kann ich sagen, dass es einen weißen Hintergrund auf das Bild setzen soll? Ich überprüfte die Man-Page aus, konnte aber nichts sehen hilfreich:

http://search.cpan.org/dist/Image-Resize/Resize.pm

Dank!

UPDATE: Für alle mit Interesse, was ich tun am Ende wurde sie nur von einem .png .jpg Umwandlung convert verwendet wird;

convert "$read_path" -background white -flatten "$path/$filename" 

, die tatsächlich in diesem Fall besser klappt, wie wir brauchen nicht die Transparenz (und jpg sind viel kleiner in der Größe)

+0

Da Sie ein [GD :: Image] (https://metacpan.org/pod/GD) zurückbekommen, können Sie seine Methode verwenden, um Dinge zu überprüfen und zu ändern. Finden Sie heraus, ob die Transparenz zuerst richtig eingestellt ist und wie sie dann weiß dargestellt wird, bevor Sie sie drucken. – simbabque

Antwort

1

Das Image::Resize Modul nur das tut, das Bild passt die Größe.

Es gibt jedoch ein Objekt GD::Image zurück. Sie können dann die volle Leistung von gd für Ihr Bild verwenden. Die Methode GD::Image::transparent ist möglicherweise das, wonach Sie suchen. Kopiert von docs

# allocate some colors 
my $white = $im->colorAllocate(255,255,255); 

# make the background transparent and interlaced 
$im->transparent($white); 
$im->interlaced('true'); 

Die $im ist ein GD::Image Objekt, in Ihrem Fall zurück von Image::Resize::resize.

Das spezielle Problem wird nicht erklärt und ich bin mir nicht sicher, wie Sie den schwarzen Hintergrund aufnehmen, aber wenn das oben genannte nicht tut, finden Sie die spezifische Lösung mit der GD::Image.


This post kann auf eine direkte Antwort führen, durch die Verknüpfung zu this post : ermöglichen die saveAlpha() GD Einstellung.

Danke an Wick für den Kommentar.

+0

Danke für das Beispiel.Schlägst du etwas vor wie: \t \t \t 'my $ image = Bild :: Größe-> neu ($ read_path); \t \t \t mein $ weiß = $ image-> colorAllocate (255,255,255); \t $ image-> transparent ($ weiß); $ image-> interlaced ('wahr'); \t mein $ gd = $ image-> resize (1000,1000); ' Als das scheint nicht zu funktionieren :( –

+0

@AndrewNewby So etwas, ja. Ich würde zuerst die Größe ändern und dann den Hintergrund festlegen Das Problem ist, dass Ihr Ergebnis den schwarzen Hintergrund irgendwo anders aufhebt. Es geht nicht um die Größenanpassung. Der Sinn dafür ist es, 'GD :: Image' zu ​​verwenden - Sie können damit sicherlich umgehen (beachten Sie, dass dies der Fall ist) das GD-Modul, das Ganze. Ich denke, dass Sie identifizieren müssen, was es schwarz (und wann) setzt. – zdim

+0

Danke.Ich endete damit, ein bisschen einen schmutzigen Hack zu machen, indem ich es von PNG umwandelte in JPG mit imagemagick: '' convert '$ read_path "-background weiss -flatten" $ path/$ filename "'; '. TBH, das ist wahrscheinlich die beste Option, da JPGs sind viel kleiner in der Dateigröße im Vergleich zu PNG –