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() の quialty パラメーターはパーセンテージではなく、0 から 9 までの数値であることを見逃していました。

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