Jump to content

[SOLVED] Add watermark to image script works on localhost but not on web server.


poleposters

Recommended Posts

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
?>

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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>?

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.