in reply to GD + layering text over existing image

There is an easy solution that does not require Perl: ImageMagick.

It's a command line tool for lots of image processing tasks (there is a wrapper module in CPAN also, if you'd still prefer using perl).

In particular, it has a "-draw" command that lets you add text labels to images: http://www.imagemagick.org/script/command-line-options.php#draw

  • Comment on Re: GD + layering text over existing image

Replies are listed 'Best First'.
Re^2: GD + layering text over existing image
by zentara (Cardinal) on Nov 25, 2008 at 19:26 UTC
      Hi zentara,

      Thanks for your reply too :) I was tempted to use Image::Magick - but I was lead to believe that its a bit more of a resource hog in comparison to GD (we're going to be serving about 1 million of the "script calls" a day - so every bit extra CPU isn't desirable :))

      Cheers

      Andy
Re^2: GD + layering text over existing image
by ultranerds (Hermit) on Nov 25, 2008 at 18:20 UTC
    Hi,

    Mmm.. got a weird problem :/

    http://members.domain.com/cgi-bin/art/page.cgi?p=test

    ...thats using exactly the same code.

    Images are:

    http://www.domain.pro/images/badges/badgeXL500.png
    http://www.domain.pro/images/badges/badgeMD500.png
    http://www.domain.pro/images/badges/badgeSM500.png

    http://www.domain.pro/images/badges/badgeXL.png
    http://www.domain.pro/images/badges/badgeMD.png
    http://www.domain.pro/images/badges/badgeSM.png

    The code is pretty bog standard:

    my $size = lc($IN->param('size')) || "m"; print qq|Content-type: image/png \n\n|; # print "FOO"; use GD; my $filename; if ($size eq "l") { $filename = qq|/home/domain/domain.pro/www/images/badges/badge +XL500.png|; } elsif ($size eq "m") { $filename = qq|/home/domain/domain.pro/www/images/badges/badge +MD500.png|; } elsif ($size eq "s") { $filename = qq|/home/domain/domain.pro/www/images/badges/badge +SM500.png|; } # create a new image # my $im = new GD::Image(100,100); my $im = GD::Image->new( $filename ); # allocate some colors my $black = $im->colorAllocate(0,0,0); if ($size eq "l") { $im->string(gdMediumBoldFont,27,44,"Secure " . GT::Date::date_ +get() ,$black); } elsif ($size eq "m") { $im->string(gdMediumBoldFont,29,26,"Secure " . GT::Date::date_ +get(),$black); } elsif ($size eq "s") { $im->string(gdTinyFont,15,26,"Safe " . GT::Date::date_get() ,$ +black); } # make sure we are writing to a binary stream binmode STDOUT; # Convert the image to PNG and print it on standard output print $im->png;


    ..however, its confusing the hell out of me with whats going on with the text color. Could it have something to do with the pallet of the image?

    TIA!

    Andy
      whats going on with the text color. Could it have something to do with the pallet of the image?

      Without having access to the original images I'd guess: probably.

      Perhaps the easiest way to avoid the problem would be to ensure that the image files get loaded as 'truecolor' (Ie. full 24-bit colour). You can do that by setting GD::Image->trurColor( 1 ); prior to loading the image. You'd then dump the colorAllocate() call and specify the text color directly using its rgb value. Simply 0 for black:

      ... ## Set the default to truecolor images. GD::Image->trueColor( 1 ); # create a new image my $im = GD::Image->new( $filename ); if ($size eq "l") { $im->string(gdMediumBoldFont,27,44,"Secure ". GT::Date::date_g +et(), 0 ); } elsif ($size eq "m") { $im->string(gdMediumBoldFont,29,26,"Secure ". GT::Date::date_g +et(), 0 ); } elsif ($size eq "s") { $im->string(gdTinyFont,15,26,"Safe " . GT::Date::date_get() , +0); } binmode STDOUT; print $im->png;

      For colors other than black, I use a simple utility sub to convert rgb triples to their integer representation:

      sub rgb2n{ unpack 'N', pack 'CCCC', 0, @_ } rgb2n( 255, 0, 0 ); ## Red rgb2n( 0, 255, 0 ); ## Green rgb2n( 0, 0, 255 ); ## Blue

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Hi,

        Your a star!

        GD::Image->trueColor( 1 );

        ...works like a charm!"

        Thanks for your time :)

        Andy