Search code examples
phpimageresizeimage.createimage

Resizing give some black image


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


Solution

  • 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