$xNeTworKx: Frage zu Image::Magick

Hallo,
Ich habe zur Probe mal ein kleines Script gemacht, daß Fotos verkleinern soll :
#!/usr/bin/perl -w

use strict;
use Image::Magick;
use Image::Size;

my $image = Image::Magick->new;
my $img = $image->Read( filename=>'alt1.jpg' );
my ($x, $y) = imgsize('alt1.jpg');
my ($width, $height) = sprintf("%d %d", $x * .15, $y * .15);
$img = $image->Resize($width x $height);# Diese Zeile funktioniert nicht
$img = $image->Write( filename=>'smallalt1.jpg' );

das Problem ist, daß diese Zeile irgendwie keinen dynamischen Inhalt annehmen kann. Das Script funktioniert wunderbar wenn ich 2 fixe Werte dort hineinschreibe, also zB $img = $image->Resize('80x53'); , aber wenn es dymaisch sein soll, bekomme ich nur Fehlermeldungen wie : Argument "" isnt numeric in repeat (x), oder Use of uninitialized value in repeat (x). Was kann ich da tun ?

  1. Hallo $xNeTworKx,

    probiers doch mal mit:

    $img = $image->Resize('$width x $height');

    dann müsste es funktionieren...

    Sebastian

    1. Hallo,

      $img = $image->Resize('$width x $height');

      nein, leider auch nicht =(, so bleibt das Bild in der selben Größe, irgendwie klar, weil die Variablen mit ' nicht interpretiert werden.

      $xNeTworKx.

  2. Tach

    Ich habe zur Probe mal ein kleines Script gemacht, daß Fotos verkleinern soll :

    ??????

    $img = $image->Resize($width x $height);# Diese Zeile funktioniert nicht

    das Problem ist, daß diese Zeile irgendwie keinen dynamischen Inhalt annehmen kann. Das Script funktioniert wunderbar wenn ich 2 fixe Werte dort hineinschreibe, also zB $img = $image->Resize('80x53');

    weil $width x $height
    was anderes ist als '80x53', selbst wenn 80 und 53 in den Variablen drinsteht.
    $width."x".$height ergibt da was ähnlicheres ;-)
    Abgesehen davon verstehe ich schon nicht, was Du mit

    my ($width, $height) = sprintf("%d %d", $x * .15, $y * .15);

    bewirken willst.

    wie wäre es mit
    my ($width, $height) = ($x * .15, $y * .15);
    $img = $image->Resize($width."x".$height);
    ?

    Ich kenn das Image::Magick nicht, aber Du sagst ja, daß '80x53' funktioniert...

    Andreas

    1. Hallo,

      das Problem ist, daß diese Zeile irgendwie keinen dynamischen Inhalt annehmen kann. Das Script funktioniert wunderbar wenn ich 2 fixe Werte dort hineinschreibe, also zB $img = $image->Resize('80x53');

      weil $width x $height
      was anderes ist als '80x53', selbst wenn 80 und 53 in den Variablen drinsteht.
      $width."x".$height ergibt da was ähnlicheres ;-)

      Wenn ich es so mache, produziert Pwerl eine Endlosschleife, weis auch nicht warum. Ich habe schon so ziemlich alle Variationen ausprobiert, aber ohne Erfolg.

      Abgesehen davon verstehe ich schon nicht, was Du mit

      my ($width, $height) = sprintf("%d %d", $x * .15, $y * .15);
      bewirken willst.

      Ich will $width und %height auf ganze Zahlen runden. Ich weis ja nicht ob sich Längen und Höhenangaben, die in etwa so aussehen 80.3 x 60.2 mit der Methode $image->Resize vertragen. Sollte nur dazu dienen einen Fehlerbereich mal auszuschalten.

      $xNeTworKx.

      1. Hallo,

        das Problem ist, daß diese Zeile irgendwie keinen dynamischen Inhalt annehmen kann. Das Script funktioniert wunderbar wenn ich 2 fixe Werte dort hineinschreibe, also zB $img = $image->Resize('80x53');

        weil $width x $height
        was anderes ist als '80x53', selbst wenn 80 und 53 in den Variablen drinsteht.
        $width."x".$height ergibt da was ähnlicheres ;-)

        Wenn ich es so mache, produziert Pwerl eine Endlosschleife, weis auch nicht warum. Ich habe schon so ziemlich alle Variationen ausprobiert, aber ohne Erfolg.

        Abgesehen davon verstehe ich schon nicht, was Du mit

        my ($width, $height) = sprintf("%d %d", $x * .15, $y * .15);
        bewirken willst.

        Ich will $width und %height auf ganze Zahlen runden. Ich weis ja nicht ob sich Längen und Höhenangaben, die in etwa so aussehen 80.3 x 60.2 mit der Methode $image->Resize vertragen. Sollte nur dazu dienen einen Fehlerbereich mal auszuschalten.

        Das tut es aber nicht. sprintf gibt EINEN String zurück, der an das erste Listenelement der linken Liste (d.h. an $width) zugewiesen wird.
        $height wird dabei nichts zugewiesen.

        Mach doch
        $param =
        sprintf("%dx%d", $x * .15, $y * .15);
        und übergib dann $param an die Methode.

        1. Hallo,

          Mach doch
          $param =
          sprintf("%dx%d", $x * .15, $y * .15);
          und übergib dann $param an die Methode.

          Es funktioniert jetzt. Scheint so, daß es wirklich irgendwie daran lag, daß es ein String anstatt einer Zahl war. also wegen dem sprintf .
          So sieht es nun aus.

          my $image = Image::Magick->new;
          my $img = $image->Read( filename=>'alt1.jpg' );
          my ($x, $y) = imgsize('alt1.jpg');
          my ($width, $height) = ($x * .15, $y * .15);
          $img = $image->Resize("$width x $height");
          $img = $image->Write(filename=>'smallalt1.jpg' );

          P.S. So wie es scheint, rundet das Modul die Zahlen automatisch, rauf bzw runter.

          $xNeTworKx.