0

我编写了一个脚本来上传、缩放、重新采样和保存图像以用作我网站上的头像。这适用于 JPG 和 GIF 文件,但是当我尝试上传 PNG 文件时,它只会返回一个损坏的图像文件。我在这里搜索了答案,但没有找到任何有帮助的东西。

  • 是的,我知道 MIME 类型是正确的。
  • 是的,我知道文件完好无损
  • 是的,我知道这是在“选择”案例“png”
  • 不,没有输出错误或警告。

这是到目前为止我得到的代码,或者至少是出现故障的代码:

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);

}
4

2 回答 2

2

最大可能的质量imagejpg()是 100,但imagepng()只有 9,你有 60,也许你混淆了 imagepng 和 imagejpg。

于 2012-12-04T10:34:52.353 回答
1

解决方案很简单。我刚刚错过了 imagepng() 中的质量参数不应该是百分比,而是 0 到 9 之间的数字。

imagepng($new, $filename, 6);
于 2012-12-04T10:34:18.660 回答