I'm using a function to resize pictures.
Most of images are resized very well. but someone, I don't why are only black. the same picture always give black result. May be it's the kind of Jpeg who give this.. but how to change it?
Thanks !
function create_image($file) {
if(is_file($file)) {
$size = getimagesize($file);
// y =hauteur en pixel
$y = 800;
$x = $size[0]/$size[1]*$y;
//$y = 75; # Taille en pixel de l'image redimensionnée
if ($size) {
if ($size['mime']=='image/jpeg' ) {
$img_big = imagecreatefromjpeg($file);
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagejpeg($img_mini,$file );
}
elseif ($size['mime']=='image/png' ) {
$img_big = imagecreatefrompng($file);
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagepng($img_mini,$file );
}
elseif ($size['mime']=='image/gif' ) {
$img_big = imagecreatefromgif($file);
$img_new = imagecreate($x, $y);
# création de la miniature
$img_mini = imagecreatetruecolor($x, $y)
or $img_mini = imagecreate($x, $y);
// copie de l'image, avec le redimensionnement.
imagecopyresized($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
imagegif($img_mini,$file );
}
// move_uploaded_file($img_mini,$dir."test");
}
return true;
} else {
return false;
}
}
EDIT : Thanks !
The optimisation is good ...
But the result is the same with the images like : http://www.ericae.fr/test_images/Ripper.jpg resized give : http://www.ericae.fr/test_images/resized.jpg All black :(
With others images the result is good !!! I've test around 25 images only 2 makes problems... WHY ????
I decided to review your code. Why do you use the same procedures many times when you can do it once?
Also I recommend to use imagecopyresampled
instead of imagecopyresized
, it will give you a better result without black screens.
Look at this, I commented anything that I changed for you:
function create_image($file)
{
if(is_file($file))
{
$size = getimagesize($file);
if ($size)
{
$y = 800;
$x = $size[0]/$size[1]*$y;
$mime = $size['mime'];
// Detect image format and create a GD resource
switch ($mime)
{
case 'image/jpeg' : $img_big = imagecreatefromjpeg($file); break;
case 'image/png' : $img_big = imagecreatefrompng($file); break;
case 'image/gif' : $img_big = imagecreatefromgif($file); break;
// Wrong type - exiting
default: return false;
}
// Create a new image for resizing
$img_mini = imagecreatetruecolor($x, $y);
// This function is better for image resizing than imagecopyresized
// Gives you better quality and no black screens
imagecopyresampled($img_mini,$img_big,0,0,0,0,$x,$y,$size[0],$size[1]);
// OK, now we ready to save your image!
// We will save it in the same format as original
switch ($mime)
{
case 'image/jpeg' : $img_big = imagejpeg($img_mini, $file); break;
case 'image/png' : $img_big = imagepng($img_mini, $file); break;
case 'image/gif' : $img_big = imagegif($img_mini, $file); break;
default: return false;
}
// Don't forget to free memory.
imagedestroy($img_big); imagedestroy($img_mini);
return true;
// Don't do this. It's wrong.
// move_uploaded_file($img_mini,$dir."test");
}
// didn't get size
else
return false;
} // isn't a file
else
return false;
}
I hope it was useful for you :3