in reply to Re: GD + layering text over existing image
in thread GD + layering text over existing image

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

Replies are listed 'Best First'.
Re^3: GD + layering text over existing image
by BrowserUk (Patriarch) on Nov 25, 2008 at 19:07 UTC
    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