【问题标题】:How to ensure JPEG image is valid and can be handled by PHP?如何确保 JPEG 图像有效并且可以由 PHP 处理?
【发布时间】:2012-09-10 17:14:46
【问题描述】:

我有这个 JPEG,它给我正在使用的 Resizer library 中的函数 imagesx($this->image) 带来了问题。我可以使用浏览器查看图像,但在尝试调整大小时出现错误:

imagesx() expects parameter 1 to be resource, boolean given

如果要抛出错误,我可以不处理此文件。如何使用 PHP 来检查这个图像是否可以被 PHP 的图像函数正确处理?


调用库的代码

// Download the photo
$img_content = file_get_contents($url);
if($img_content !== FALSE) {
    file_put_contents($img_documentroot . $img_subpath . $img_filename . '_tmp.jpg',
     $img_content);
}

echo $url . '<br>';
echo $img_documentroot . $img_subpath . $img_filename . '_tmp.jpg<br>';
ob_flush();
flush();

// Resize photo
Resizer::open( $img_documentroot . $img_subpath . $img_filename . '_tmp.jpg' )
->resize(300, 300, 'landscape' )
->save($img_documentroot . $img_subpath . $img_filename . '.jpg' , 90 );

// Thumbnail photo
Resizer::open( $img_documentroot . $img_subpath . $img_filename . '_tmp.jpg' )
->resize(100, 100, 'crop' )
->save($img_documentroot . $img_subpath . $img_filename . '.jpg' , 90 );

输出

我还回显了正在调整大小的图像的完整路径。

http://www.ApartmentsInAllstonMA.com/Images/Apts/132847_kn1.jpg
/home/photos/public_html/2012/0917/2516539_7_tmp.jpg
resource(127) of type (gd)
resource(130) of type (gd)
http://www.ApartmentsInMedford.com/Images/Apts/132847_lv2.jpg
/home/photos/public_html/2012/0917/2516539_11_tmp.jpg
resource(163) of type (gd)
resource(166) of type (gd)
http://www.AllstonApartmentX.com/images/agents/61.jpg
/home/photos/public_html/2012/0917/2516539_12_tmp.jpg
bool(false)

更新

这是导致库返回 false 值的代码 sn-p。

private function open_image( $file )
{

    // If $file isn't an array, we'll turn it into one
    if ( !is_array($file) ) {
        $file = array(
            'type'      => File::mime( strtolower(File::extension($file)) ),
            'tmp_name'  => $file
        );
    }

    $mime = $file['type'];
    $file_path = $file['tmp_name'];

    switch ( $mime )
    {
        case 'image/pjpeg': // IE6
        case File::mime('jpg'): $img = @imagecreatefromjpeg( $file_path );  break;
        case File::mime('gif'): $img = @imagecreatefromgif( $file_path );   break;
        case File::mime('png'): $img = @imagecreatefrompng( $file_path );   break;
        default:                $img = false;                               break;
    }

    return $img;
}

【问题讨论】:

  • 您将错误传递给您正在使用的库或您正在使用的库在内部已损坏。错误清楚地说明了错误是什么,错误的参数类型。您可能需要重新考虑更改库或向我们展示您用于调用实际函数的代码。
  • 听起来$this-&gt;image 是一个布尔值,而它应该是一个图像资源。试试var_dump($this-&gt;image) 看看会发生什么。
  • 我在一组图像上做了一个 var_dump($this->image)。对于正确的图像,我得到类似resource(64) of type (gd) 的信息,但对于给出错误的图像,我得到bool(false)。此图片确实存在,我可以使用浏览器访问它。

标签: php apache imagemagick gd laravel


【解决方案1】:

检查mime类型是保证JPEG图像有效性的一个很好的方法。以下是您可以执行此操作的方法。

$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type
$type = finfo_file($finfo, $filename) . "\n";  
if($type == "image/jpeg") { 
     //Valid JPEG Image
}
finfo_close($finfo);

根据您的错误,您发送的是 boolean 值而不是图像资源

【讨论】:

  • 检查 mime 类型是否有助于确保我没有发送布尔值?我猜它会发送一个false 布尔值,因为该文件不是有效的图像。
  • 将使用is_resource() 来检查这个坏图像有帮助吗?我正在考虑检查返回 bool false 的图像并忽略它
  • @Nyxynyx,先检查图像的有效性,然后再继续处理。
  • is_resource() 不起作用,我正在尝试在服务器上启用finfo()
【解决方案2】:

该文件可能具有 .JPG 扩展名,但这并不一定意味着它是正确的文件类型。我之前看到用户将一个 .PNG 文件重命名为 .JPG,他们认为他们可以通过这种方式在格式之间进行转换。

它也可能是使用 CMYK 颜色空间而不是 RGB 颜色空间的有效 JPEG 文件。每隔一段时间,我就会看到其中一个——通常来自印刷设计师。我通常通过在 Photoshop 中打开它们并在图像 -> 模式下查看它是否显示 RGB 或 CMYK 来检查它们。在 Windows 中,您还可以通过右键单击、选择属性,然后查看高级选项卡来确定色彩空间。

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多