PHP - GD在某些文件上失败只是为什么?

时间:2016-06-21 02:16:58

标签: php image image-processing gd

我正在使用以下示例代码来调整给定图像的大小,但是有些图像(只有极少数几张照片但很多次)失败并返回黑色jpeg 而没有任何功能错误

但是,如果我在Photoshop中打开该图像并再次将其保存为 AS IT IS 作为JPEG(相同的文件类型),那么它似乎正在工作。它正确调整新保存的图像的大小。

我想知道原件有什么问题吗?因为原始文件似乎格式正确,甚至可以在Windows照片查看器中打开。

请注意

没有问题
  1. 文件不存在

  2. 文件类型......等(扩展名为jpeg)

  3. 抱歉,由于隐私原因,我无法发布样本照片。

  4. 安装了最新的GD库并且可以正常使用其他图像

  5. 其实我发现它的" $ image = imagecreatefromjpeg($ filename);"如果失败则会为失败的图像返回false,而其他的则返回"类型(gd)的资源(5)"当我做" var_dump($ image);"

  6. 进一步的调试发现我跟着错误

    Warning: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Invalid SOS parameters for sequential JPEG

    有什么解决方案或理由吗?

    我用来调整大小的代码如下。

    <?php
    
    $thumb=resizeImage('20160612_123658_web.jpg',500,500);
    // Set the content type header - in this case image/jpeg
    header('Content-Type: image/jpeg');
    // Output
    imagejpeg($thumb);
    
    /**
    * Resize an image and keep the proportions
    * @author Allison Beckwith <allison@planetargon.com>
    * @param string $filename
    * @param integer $max_width
    * @param integer $max_height
    * @return image
    */
    function resizeImage($filename, $max_width, $max_height)
    {
        list($orig_width, $orig_height) = getimagesize($filename);
    
        $width = $orig_width;
        $height = $orig_height;
    
        # taller
        if ($height > $max_height) {
            $width = ($max_height / $height) * $width;
            $height = $max_height;
        }
    
        # wider
        if ($width > $max_width) {
            $height = ($max_width / $width) * $height;
            $width = $max_width;
        }
    
        $image_p = imagecreatetruecolor($width, $height);
    
        $image = imagecreatefromjpeg($filename);
    
        imagecopyresampled($image_p, $image, 0, 0, 0, 0,
                                         $width, $height, $orig_width, $orig_height);
    
        return $image_p;
    }
    

1 个答案:

答案 0 :(得分:0)

在运行imagemagick的convert.exe时,我对使用手机拍摄的照片(S5)有一个类似的问题,而不是系统的问题。

使用IrfanView无损JPEG插件(快捷键“J”)清除有问题的图像后,问题停止了,选项“无(可用于优化和清洁)”。然后使用convert.exe没有导致任何警告。

因此,这可能是图像元数据的不合规问题。对我来说,这并没有引起引用的黑色图像问题。修复源JPEG文件似乎是前进的方向。