PHP imagecreatefromjpeg works, so why doesn't png/bmp/gif work?

12,110

Solution 1

Your PHP may not be compiled with support for those formats. Run a phpinfo() and inspect the output for something like this:

GD Support => enabled
GD Version => bundled (2.0.34 compatible)
GIF Read Support => enabled
GIF Create Support => enabled
PNG Support => enabled
libPNG Version => 1.2.10

Solution 2

Since you seem to be getting a corrupt 33 byte image file every time for images other then jpg, this could be a PHP error that is getting written to the file (since it seems like your PHP file is displaying the image contents directly, from your Content Type header). Have you tried opening the file in a text editor and seeing its contents? If its garbeled junk, then its an error, but if its a PHP warning, your version of PHP probably doesn't have support for those extended image types. That, or there could be a warning in your code somewhere.

Share:
12,110
ezattilabatyi
Author by

ezattilabatyi

Updated on June 27, 2022

Comments

  • ezattilabatyi
    ezattilabatyi almost 2 years

    I want to upload and resize pictures with different extensions. The php crops the biggest possible square from the center of the original pic, then saves it in 360*360 pixels.

    The code works fine with jpeg files, but with gif, bmp and png I get a corrupted file with 33 Byte size.

    Here's most of the code:

    $file_temp = $_FILES["pic"]["tmp_name"];
    list ($width, $height, $type) = getimagesize ($file_temp);
    
    $picture_name = "... a name.ext ...";
    $upload = "... some dir/$picture_name";
    
    
    
    if (move_uploaded_file($file_temp, "$upload"))
    {
    
    
    
        //switches content-type and calls the imagecreatefrom... function
        if ($type == 1)
        {
            header ('Content-Type: image/gif');
            $image = imagecreatefromgif($upload);
        }
        elseif ($type == 2)
        {
            header ('Content-Type: image/jpeg');
            $image = imagecreatefromjpeg($upload);
        }
        elseif ($type == 3)
        {
            header ('Content-Type: image/png');
            $image = imagecreatefrompng($upload);
        }
        else
        {
            header ('Content-Type: image/x-ms-bmp');
            $image = imagecreatefromwbmp($upload);
        }
    
    
        $image_p = imagecreatetruecolor(360, 360);
    
    
    
    
        //this code below should preserve transparency but I couldn't try it out for now...
    
        if($type==1 or $type==3)
        {
            imagecolortransparent($image_p, imagecolorallocatealpha($image_p, 0, 0, 0, 127));
            imagealphablending($image_p, true);
            imagesavealpha($image_p, true);
        }
    
    
    
    
    
        //this part is for cropping
        $x=0;
        $y=0;
    
        if ($width > $height)
        {
            $x= ($width - $height)/2;
            $width = $height;
        }
        else
        {
            $y = ($height - $width)/2;
            $height = $width;
        }
    
    
    
    
    
        imagecopyresampled ($image_p, $image, 0, 0, $x, $y, 360, 360, $width, $height);
        if ($type == 1)
            imagegif ($image_p, $upload, 80);
        elseif ($type == 2)
            imagejpeg ($image_p, $upload, 80);
        elseif ($type == 3)
            imagepng ($image_p, $upload, 80);
        else
            imagewbmp ($image_p, $upload, 80);
    }
    

    So, only jpeg files are processed correctly, gif, png and bmp files aren't. I'm out of ideas...
    Thanks in advance!