Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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!

like image 387
ezattilabatyi Avatar asked Apr 05 '12 15:04

ezattilabatyi


2 Answers

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
like image 130
Alex Howansky Avatar answered Oct 12 '22 10:10

Alex Howansky


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.

like image 45
Jeff Geisperger Avatar answered Oct 12 '22 11:10

Jeff Geisperger