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

The following:
#!/usr/bin/perl use CGI qw/:standard/; use Image::Magick; print header, start_html('file upload'), h1('file upload'); print_form() unless param; print_results() if param; print end_html; sub print_form { print start_multipart_form(), filefield(-name=>'upload',-size=>60),br, submit(-label=>'Upload File'), end_form; } sub print_results { my $length; my $file = param('upload'); if (!$file) { print "No file uploaded."; return; } open FILE, "> ../new.jpg" or die $!; while (<$file>) { print FILE $_; } close FILE; my $src = Image::Magick->new; $src->Read('../new.jpg'); # my ($ox,$oy) = $src->Get('width','height'); # my $r = $ox / 300; # $src->Resize(width=>300,height=>$oy/$r); $src->Annotate(text=>'Test Magick', y =>30 ); $src->Write('../new.jpg'); }
does not put the text on the photo. If I uncomment the resize, the resize does work (tho' still not the text), so my script is obviously calling on Image::Magick. Is there something else I need to be doing to make the text appear?

Replies are listed 'Best First'.
Re: Image::Magick text on jpeg
by saintmike (Vicar) on Aug 14, 2004 at 23:23 UTC
    Here's an article (achtung, German!) which lists some examples, including a script manip.pl inserting text into a Jpeg. Here's the call to annotate:
    20 $image->Annotate(text => "Woohoo!", 21 geometry => "+55+30", 22 pen => "red", font => 'helvetica', 23 pointsize => 30);
      Thanks for bringing that to my attention, saintmike.

      I tried adapting my script with the revised Annotate - still no text on the photo.

      So I used the whole script as written by Michael Schilli, simply changing file names and adding headers. The result? A perfectly cropped photo in a nice frame with absolutely NO annotation!! This is driving me insane :) I'm particularly bemused as I have done a search on google and cannot find a particular issue with annotate on unix servers. If there was such an issue I would have thought there would be a fair amount of noise about it.

      #!/usr/bin/perl ################################################## # mschilli@perlmeister.com 1999 # Ein Bild manipulieren ################################################## use Image::Magick; $image = Image::Magick->new; $image->Read("../new.jpg") && die "Cannot read"; $image->Crop(geom=>'155x300+110+100'); $image->Scale(width => 200); $image->Frame(inner => 2, outer => 2, width => 20, height => 20); $image->Annotate(text => "Woohoo!", geometry => "+55+30", pen => "red", font => 'helvetica', pointsize => 30); $image->Write("../new1.jpg") && die "Cannot write"; print "Content-type: text/html\n\n"; print "finished";
      Update: I have just checked the version of Image::Magick my server is running and it is 5.45 In the hope it might help, I have just requested an upgrade...
Re: Image::Magick text on jpeg
by Conrad.Irwin (Novice) on Jul 20, 2007 at 18:59 UTC
    After a bit of guesswork I found the problem! Because - on webservers - there is no graphical environment, there is no need to install any fonts. Therefore, when Image::Magick looks for fonts that are standard on all systemts, it cant find them. The solution i used was to install gsfonts (on debian apt-get install gsfonts) and I assume something similar for other distributions. ImageMagick fails silently if it cant find the font - which is very irritating of it.