Christian Lundahl
Christian Lundahl

Reputation: 2050

Broken image from PNG files with GD

I've written a script to upload, scale, resample and save an image for use as avatar on my site. This works well with JPG and GIF files, but when I try uploading a PNG file it just returns a broken image file. I've searched here for an answer but not found anything that helped.

This is the code I've got so far, or at least the piece that's malfunctioning:

if(@$_FILES['newAvatar']['name'] != '') {
    $filename = 'profpics/' . $_SESSION['id'] . '__' . date("Y_m_d__H_i_s") . '__' . $_FILES['newAvatar']['name'];
    move_uploaded_file($_FILES['newAvatar']['tmp_name'], $filename);

    // Kontrollera filändelse för att gd ska veta vilken filtyp att konvertera från.
    switch(end( explode( ".", strtolower($filename) ) )):
        case "jpg":
            $image = imagecreatefromjpeg($filename);
            break;
        case "jpeg":
            $image = imagecreatefromjpeg($filename);
            break;
        case "gif":
            $image = imagecreatefromgif($filename);
            break;
        case "png":
            $image = imagecreatefrompng($filename);
            break;
        default:
            $image = imagecreatefromjpeg($filename);
    endswitch;

    // Max slutliga dimensioner
    $max_width = 200;
    $max_height = 270;

    // Nuvarande dimensioner
    $old_width = imagesx($image);
    $old_height = imagesy($image);

    // Beräkna skala
    $scale = min($max_width/$old_width, $max_height/$old_height);

    // Sätt nya dimensioner utifrån den beräknade skalan
    $new_width = ceil($scale*$old_width);
    $new_height = ceil($scale*$old_height);

    // Skapa tomt bildobjekt
    $new = imagecreatetruecolor($new_width, $new_height);

    // Förminska (troligtvis, annars förstora, men det lär väl aldrig hända)
    imagecopyresampled($new, $image, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);

    // Spara

    // Kontrollera filändelse för att gd ska veta vilken filtyp att spara som.
    switch(end( explode( ".", strtolower($filename) ) )):
        case "jpg":
            imagejpeg($new, $filename, 60);
            break;
        case "jpeg":
            imagejpeg($new, $filename, 60);
            break;
        case "gif":
            imagegif($new, $filename, 60);
            break;
        case "png":
            imagepng($new, $filename, 60);
            break;
        default:
            imagejpeg($new, $filename, 60);
            break;
    endswitch;

    // Förstör objekt
    imagedestroy($image);
    imagedestroy($new);

    $sql = "UPDATE tblprofiles SET strAvatarPath = '" . $filename . "' WHERE userId = " . $_SESSION['id'];
    mysql_query($sql) or die(mysql_error() . "<br />" . $sql);

}

Upvotes: 0

Views: 572

Answers (2)

mastazi
mastazi

Reputation: 1672

The maximum possible quality for imagejpg() is 100 but for imagepng() is only 9, you have 60 there, maybe you confused imagepng and imagejpg.

Upvotes: 2

Christian Lundahl
Christian Lundahl

Reputation: 2050

The solution was simple. I've just missed that the quialty parameter in imagepng() should not be a percentage, but a number between 0 and 9.

imagepng($new, $filename, 6);

Upvotes: 1

Related Questions