0

Hi there,

I have a system where a user can upload an image, once an image has been uploaded php crops the image and then resizes to to a thumbnail. This works perfectly well with JPEGs, but does not work with PNGs and GIFs.

I have used code to make sure the functions can deal with PNGs and GIFs but then the code runs all that is returned is an empty png or gif file and I do not know why. Here are my functions:

Function to solely resize the image:

function createthumb($name, $filename, $new_w, $new_h)
{
	$system = explode(".", $name);
	
	if (preg_match("/jpg|jpeg/", $system[1]))
	{
		$src_img=imagecreatefromjpeg($name);
	}
	if (preg_match("/png/", $system[1]))
	{
		$src_img = imagecreatefrompng($name);
	}
	if (preg_match("/gif/", $system[1]))
	{
		$src_img = imagecreatefromgif($name);
	}

	$old_x = imagesx($src_img);
	$old_y = imagesy($src_img);	
	
	$thumb_w = $new_w;
	$thumb_h = $new_h;	

	$dst_img = ImageCreateTrueColor($thumb_w, $thumb_h);
	
	imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y); 
	
	if (preg_match("/png/", $system[1]))
	{
		imagepng($dst_img, $filename, 100); 
	} 
	else  if (preg_match("/gif/", $system[1]))
	{
		imagegif($dst_img, $filename, 100);
	}
	else
	{
		imagejpeg($dst_img, $filename, 100); 
	}
	
	imagedestroy($dst_img); 	
	imagedestroy($src_img); 
}

code to crop the image:

function createthumbcrop($name, $filename, $new_w, $new_h)
{
	$system = explode(".", $name);
	
	if (preg_match("/jpg|jpeg/", $system[1]))
	{
		$src_img=imagecreatefromjpeg($name);
	}
	if (preg_match("/png/", $system[1]))
	{
		$src_img = imagecreatefrompng($name);
		
	}
	if (preg_match("/gif/", $system[1]))
	{
		$src_img = imagecreatefromgif($name);
	}

	$old_x = imagesx($src_img);
	$old_y = imagesy($src_img);	
	
	if ($old_x > $old_y)
	{
		$width = ($old_x - $old_y) / 2;		
		$height = 0;
	}
	else if ($old_y > $old_x)
	{
		$width = 0;
		$height = ($old_y - $old_x) / 2;
	}
	else
	{
		$width = 0;
		$height = 0;
	}

	// New image size
	$thumb_w  = $new_w;
	$thumb_h = $new_h;

	// Starting point of crop
	$tlx = floor($old_x / 2) - floor($thumb_w / 2);
	$tly = floor($old_y / 2) - floor($thumb_h / 2);

	// Adjust crop size if the image is too small
	if ($tlx < 0)
	{
		$tlx = 0;
	}
	if ($tly < 0)
	{
		$tly = 0;
	}

	if (($old_x - $tlx) < $thumb_w)
	{
		$thumb_w = $old_x - $tlx;
	}
	if (($old_y - $tly) < $thumb_h)
	{
		$thumb_h = $old_y - $tly;
	}

	if ($old_x > $old_y)
	{
		$dst_img = imagecreatetruecolor($old_y, $old_y);
	}
	else if ($old_y > $old_x)
	{
		$dst_img = imagecreatetruecolor($old_x, $old_x);
	}
	else
	{
		$dst_img = imagecreatetruecolor($old_x, $old_y);
	}


	
	imagecopy($dst_img, $src_img, 0, 0, $width, $height, $old_x, $old_y);

/*
	$dst_img = ImageCreateTrueColor($thumb_w, $thumb_h);
	
	imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y); 
*/	
	
	if (preg_match("/png/", $system[1]))
	{
		imagepng($dst_img, $filename, 100); 
	} 
	else  if (preg_match("/gif/", $system[1]))
	{
		imagegif($dst_img, $filename, 100);
	}
	else
	{
		imagejpeg($dst_img, $filename, 100); 
	}
	
	imagedestroy($dst_img); 	
	imagedestroy($src_img); 
}

I hope someone can help.

Thanks.

Edited by AdriftUniform: incorrect code

2
Contributors
2
Replies
4
Views
6 Years
Discussion Span
Last Post by AdriftUniform
0

PHP has a function called 'imagecreatefromstring()';
It will let you create an image from a string regardless of the type so you don't have to keep checking for the file types.
Try something like

$src_image = imagecreatefromstring(file_get_contents($name));

You can even do error reporting

$src_image = imagecreatefromstring(file_get_contents($name))
if ( $src_image == false ) {
     die("Not a valid image");
}

From http://php.net/imagecreatefromstring
imagecreatefromstring() returns an image identifier representing the image obtained from the given data. These types will be automatically detected if your build of PHP supports them: JPEG, PNG, GIF, WBMP, and GD2.

If you try running that on a valid image and it returns false, it's likely your build of PHP was not compiled with support for that image type.
-Sam

Edited by samarudge: n/a

0

Thanks for the reply, sorry it has taken me so long to get back to you.

This seems like it could work for me but I am unsure where i would put it into my code. I am guessing that it will replace part of the code but I am not sure if I would keep the if statement and just replace 'imagecreatefromjpeg' in each case with 'imagecreatefromstring' or if I would get rid of the if statement entirely and just use that.

Hope you can help.

Thanks very much

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.