august has asked for the wisdom of the Perl Monks concerning the following question:

Does anyone know how to put the following into a system call?

convert $thumbNail1 \( +clone -threshold -1 -virtual-pixel black -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) +matte -compose Copy_Opacity -composite $thumbNail2 (works on the command-line)

Thanks

Replies are listed 'Best First'.
Re: system call to ImageMagick with many parameters fails
by moritz (Cardinal) on Sep 23, 2009 at 10:32 UTC

    What have you tried, and in what way did it fail?

    Make sure to read all of the documentation about system, it talks quite a lot about error conditions and how to detect them.

    Perl 6 - links to (nearly) everything that is Perl 6.
Re: system call to ImageMagick with many parameters fails
by Corion (Patriarch) on Sep 23, 2009 at 10:36 UTC

    You don't show us your surrounding Perl code, but I assume you're using something like the following:

    #!/usr/bin/perl -w use strict; my $thumbNail1 = 'test_1.jpg'; my $thumbNail2 = 'test_2.jpg'; my $cmd = "convert $thumbNail1 \( +clone -threshold -1 -virtual-pixel +black -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) +ma +tte -compose Copy_Opacity -composite $thumbNail2"; system($cmd) == 0 or die "Couldn't launch [$cmd]: $!/$?";

    I don't have convert ready to try this, but I think you should print out $cmd to see that it is what you expect, and you should also make sure that you properly convert the shell quoting - parentheses are special for the shell and hence need to be quoted, while they are not necessary for Perl and maybe don't need to be quoted, depending on whether Perl decides to involve a shell in your system call or not (I presume it decides against it). In any case, you could try the list form of system, to make sure there is no shell involved that might mess with your command line:

    my @cmd = ( 'convert, $thumbNail1 qw[( +clone -threshold -1 -virtual-pixel black -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 ) +matte -compose Copy_Opacity -composite ], $thumbNail2 ); system(@cmd) == 0 or die "Couldn't launch [@cmd]: $!/$?";
      Jep, I simplified the script and added your list so it looks like:

      #!/usr/bin/perl -w use Image::Magick; my $file="1251748705.jpg"; my $rfile="thumbnail.gif"; my $rrfile="thumbnail2.png"; my @cmd = ( "convert, $rfile qw[( +clone -threshold -1 -virtual-pixel black -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 ) +matte -compose Copy_Opacity -composite ], $rrfile" ); system("convert -size 500x180 $file -auto-orient -thumbnail 250x90 +-unsharp 0x.5 $rfile"); system(@cmd) == 0 or die "Couldn't launch [@cmd]: $!/$?";

      The script tells me

      convert,: not found thumbnail.gif: not found Syntax error: word unexpected (expecting ")") Couldn't launch [convert, thumbnail.gif qw[( +clone -threshold -1 -virtual-pixel black -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 ) +matte -compose Copy_Opacity -composite ], thumbnail2.png]: No such file or directory/512 at ./IMT +est33.pl line 26.

      What did I miss??? Thanks

        You didn't miss much, but I missed a single quote at the start of my list.

        Change

        my @cmd = ( "convert, ... ], $rrfile" );

        to

        my @cmd = ( "convert", ... ], $rrfile );

        What you should put into @cmd is the list of arguments, and not a string containing that list.