poleposters Posted February 16, 2009 Share Posted February 16, 2009 Hey. I found a nifty script for adding a watermark to an image. It works great on my localhost. But I just get a broken image icon when running on my webserver. I've checked the phpinfo and GD is enabled. I can't think why it won't work. Does anybody have any ideas? <?php # include our watermerking class include 'api.watermark.php'; $watermark = new watermark(); # create image objects using our user-specified images # NOTE: we're just going to assume we're dealing with a JPG and a PNG here - for example purposes $main_img_obj = imagecreatefromjpeg( $_GET['main'] ); $watermark_img_obj = imagecreatefrompng( $_GET['watermark'] ); # create our watermarked image - set 66% alpha transparency for our watermark $return_img_obj = $watermark->create_watermark( $main_img_obj, $watermark_img_obj, 66 ); # display our watermarked image - first telling the browser that it's a JPEG, # and that it should be displayed inline header( 'Content-Type: image/jpeg' ); header( 'Content-Disposition: inline; filename=' . $_GET['src'] ); imagejpeg( $return_img_obj, '', 50 ); ?> api.watermark.php <?php class watermark{ # given two images, return a blended watermarked image function create_watermark( $main_img_obj, $watermark_img_obj, $alpha_level = 100 ) { $alpha_level /= 100; # convert 0-100 (%) alpha to decimal # calculate our images dimensions $main_img_obj_w = imagesx( $main_img_obj ); $main_img_obj_h = imagesy( $main_img_obj ); $watermark_img_obj_w = imagesx( $watermark_img_obj ); $watermark_img_obj_h = imagesy( $watermark_img_obj ); # determine center position coordinates $main_img_obj_min_x = floor( ( $main_img_obj_w / 2 ) - ( $watermark_img_obj_w / 2 ) ); $main_img_obj_max_x = ceil( ( $main_img_obj_w / 2 ) + ( $watermark_img_obj_w / 2 ) ); $main_img_obj_min_y = floor( ( $main_img_obj_h / 2 ) - ( $watermark_img_obj_h / 2 ) ); $main_img_obj_max_y = ceil( ( $main_img_obj_h / 2 ) + ( $watermark_img_obj_h / 2 ) ); # create new image to hold merged changes $return_img = imagecreatetruecolor( $main_img_obj_w, $main_img_obj_h ); # walk through main image for( $y = 0; $y < $main_img_obj_h; $y++ ) { for( $x = 0; $x < $main_img_obj_w; $x++ ) { $return_color = NULL; # determine the correct pixel location within our watermark $watermark_x = $x - $main_img_obj_min_x; $watermark_y = $y - $main_img_obj_min_y; # fetch color information for both of our images $main_rgb = imagecolorsforindex( $main_img_obj, imagecolorat( $main_img_obj, $x, $y ) ); # if our watermark has a non-transparent value at this pixel intersection # and we're still within the bounds of the watermark image if ( $watermark_x >= 0 && $watermark_x < $watermark_img_obj_w && $watermark_y >= 0 && $watermark_y < $watermark_img_obj_h ) { $watermark_rbg = imagecolorsforindex( $watermark_img_obj, imagecolorat( $watermark_img_obj, $watermark_x, $watermark_y ) ); # using image alpha, and user specified alpha, calculate average $watermark_alpha = round( ( ( 127 - $watermark_rbg['alpha'] ) / 127 ), 2 ); $watermark_alpha = $watermark_alpha * $alpha_level; # calculate the color 'average' between the two - taking into account the specified alpha level $avg_red = $this->_get_ave_color( $main_rgb['red'], $watermark_rbg['red'], $watermark_alpha ); $avg_green = $this->_get_ave_color( $main_rgb['green'], $watermark_rbg['green'], $watermark_alpha ); $avg_blue = $this->_get_ave_color( $main_rgb['blue'], $watermark_rbg['blue'], $watermark_alpha ); # calculate a color index value using the average RGB values we've determined $return_color = $this->_get_image_color( $return_img, $avg_red, $avg_green, $avg_blue ); # if we're not dealing with an average color here, then let's just copy over the main color } else { $return_color = imagecolorat( $main_img_obj, $x, $y ); } # END if watermark # draw the appropriate color onto the return image imagesetpixel( $return_img, $x, $y, $return_color ); } # END for each X pixel } # END for each Y pixel # return the resulting, watermarked image for display return $return_img; } # END create_watermark() # average two colors given an alpha function _get_ave_color( $color_a, $color_b, $alpha_level ) { return round( ( ( $color_a * ( 1 - $alpha_level ) ) + ( $color_b * $alpha_level ) ) ); } # END _get_ave_color() # return closest pallette-color match for RGB values function _get_image_color($im, $r, $g, $b) { $c=imagecolorexact($im, $r, $g, $b); if ($c!=-1) return $c; $c=imagecolorallocate($im, $r, $g, $b); if ($c!=-1) return $c; return imagecolorclosest($im, $r, $g, $b); } # EBD _get_image_color() } # END watermark API ?> Quote Link to comment Share on other sites More sharing options...
PFMaBiSmAd Posted February 16, 2009 Share Posted February 16, 2009 Add the following two lines immediately after the opening <?php tag in the first piece of code - ini_set ("display_errors", "1"); error_reporting(E_ALL); Comment out the two header lines - // header( 'Content-Type: image/jpeg' ); // header( 'Content-Disposition: inline; filename=' . $_GET['src'] ); and see if there are any php generated errors. You might need to do a "view source" in your browser to see any errors. Quote Link to comment Share on other sites More sharing options...
poleposters Posted February 16, 2009 Author Share Posted February 16, 2009 I changed the code as you instructed. There were no errors. But instead of getting a broken image icon. I got a screen full of gibberish. ÿØÿàJFIFÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 50 ÿÛC (1#%(:3=<9387@H\N@DWE78PmQW_bghg>Mqypdx\egcÿÛC//cB8BccccccccccccccccccccccccccccccccccccccccccccccccccÿÀÂ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ etc etc. Any ideas>? Quote Link to comment Share on other sites More sharing options...
Brian W Posted February 16, 2009 Share Posted February 16, 2009 That gibberish is the image src. Are you with a shared host or do you own is the server you have problems your own? Quote Link to comment Share on other sites More sharing options...
PFMaBiSmAd Posted February 16, 2009 Share Posted February 16, 2009 Since it does appear that you are getting image data, the code is executing through to the end. Uncomment the first header line and try it with exactly the same URL parameters. Quote Link to comment Share on other sites More sharing options...
poleposters Posted February 16, 2009 Author Share Posted February 16, 2009 Success! Although it was the second header that was causing problems. Thank you. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.