Php 使用GD从PNG文件中断开图像

Php 使用GD从PNG文件中断开图像,php,png,gd,Php,Png,Gd,我写了一个脚本来上传、缩放、重采样和保存一张图片,作为我网站上的头像。这适用于JPG和GIF文件,但当我尝试上载PNG文件时,它只会返回一个损坏的图像文件。我在这里寻找答案,但没有找到任何有用的答案 是的,我知道MIME类型是正确的 是的,我知道文件是完整的 是的,我知道这是在“选择”png的案例 否,没有输出错误或警告 这是我到目前为止得到的代码,或者至少是出现故障的代码: if(@$_FILES['newAvatar']['name'] != '') { $filename =

我写了一个脚本来上传、缩放、重采样和保存一张图片,作为我网站上的头像。这适用于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);

}
if(@$\u文件['newAvatar']['name']!=''){
$filename='profpics/'.$会话['id'].\uuuuu'.日期(“Y_m_d_H_H_i_s”).\uuuuu文件['newAvatar'.['name'];
移动上传的文件($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$filename);
//这是一个非常好的例子。
开关(结束(分解(“.”,strtolower($filename)):
案例“jpg”:
$image=imagecreatefromjpeg($filename);
打破
案例“jpeg”:
$image=imagecreatefromjpeg($filename);
打破
案例“gif”:
$image=imagecreatefromgif($filename);
打破
案例“png”:
$image=imagecreatefrompng($filename);
打破
违约:
$image=imagecreatefromjpeg($filename);
终端开关;
//最大slutliga尺寸计
$max_width=200;
$max_height=270;
//努瓦朗德尺寸计
$old_width=imagesx($image);
$old_height=imagesy($image);
//贝纳斯卡拉酒店
$scale=min($max\u width/$old\u width、$max\u height/$old\u height);
//Sätt nya尺寸测量员utifrån den beräknade skalan
$new\u width=ceil($scale*$old\u width);
$new_height=天花板($scale*$old_height);
//斯卡帕·托姆特·比尔多布耶克特酒店
$new=ImageCreateTureColor($new\u宽度,$new\u高度);
//Förminska(troligtvis、annars Förstora、men det lär väl aldrig hända)
imagecopyresampled($new、$image、0、0、0、0、$new\u width、$new\u height、$old\u width、$old\u height);
//斯巴拉
//在斯帕拉索姆省的维塔维肯县,这是一个很好的例子。
开关(结束(分解(“.”,strtolower($filename)):
案例“jpg”:
imagejpeg($new,$filename,60);
打破
案例“jpeg”:
imagejpeg($new,$filename,60);
打破
案例“gif”:
imagegif($new,$filename,60);
打破
案例“png”:
imagepng($new,$filename,60);
打破
违约:
imagejpeg($new,$filename,60);
打破
终端开关;
//Förstör objekt
图像销毁($图像);
(新的);
$sql=“UPDATE tblprofiles SET strAvatarPath=”“$filename.”其中userId=“;
mysql\u query($sql)或die(mysql\u error().“
.”$sql); }
解决方案很简单。我刚刚错过了imagepng()中的quialty参数不应该是一个百分比,而是一个介于0和9之间的数字

imagepng($new, $filename, 6);

解决办法很简单。我刚刚错过了imagepng()中的quialty参数不应该是一个百分比,而是一个介于0和9之间的数字

imagepng($new, $filename, 6);

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

从什么意义上讲?你看过里面吗?文件包含什么?我在下面发布了解决方案!在什么意义上说是破碎的?你看过里面吗?文件包含什么?我在下面发布了解决方案!是的,我是!我才意识到。无论如何谢谢你!是的,我是!我才意识到。无论如何谢谢你
imagegif
没有质量字段
imagegif
没有质量字段