PHP imagecreatefromstring(): gd-jpeg, libjpeg: 可恢复的错误

Posted

技术标签:

【中文标题】PHP imagecreatefromstring(): gd-jpeg, libjpeg: 可恢复的错误【英文标题】:PHP imagecreatefromstring(): gd-jpeg, libjpeg: recoverable error 【发布时间】:2011-04-08 08:36:59 【问题描述】:

我正在尝试从我无法控制的外部站点加载图像。

大多数情况下它都能正常工作(迄今为止测试了数百张图片)。

它现在给我一个特定图像的这个错误:

imagecreatefromstring(): gd-jpeg, libjpeg: 可恢复错误:损坏的 JPEG 数据:数据段过早结束

从这一行开始:

$im = @imagecreatefromstring( $imageString );

到目前为止我读到的建议建议添加:

ini_set("gd.jpeg_ignore_warning", true);

但这没有任何效果,我仍然收到错误消息。我正在通话前进行 ini_set 。这有关系吗?

我真的很困惑如何忽略这个错误并继续。

【问题讨论】:

你有权限设置这个ini参数吗?这个警告是否会导致您的脚本终止? 顺便说一句,你只是想显示这张图片,还是真的想把它复制到你的服务器上? 我没有收到关于 INI 文件设置的任何警告,它仍然是 gdcreate 函数的致命错误。 我需要加载图像以制作缩略图并保存在本地。 那我建议先把它拷贝到你的服务器上,然后在你拷贝过来的文件上使用imagecreatefromjpeg()imagecreatefromgif()或者imagecreatefrompng()函数,这样肯定不会出错。 【参考方案1】:

问题是由于我的错误处理造成的。我会设置一个错误处理程序,以便调用

$im = @imagecreatefromstring( $imageString );

没有抑制错误。

通过修改我的错误处理程序:

   if (error_reporting() === 0)
   
        // This copes with @ being used to suppress errors
        // continue script execution, skipping standard php error handler
        return false;
   

我现在可以正确抑制选定的错误。

我在这里找到了信息:http://anvilstudios.co.za/blog/php/how-to-ignore-errors-in-a-custom-php-error-handler/

【讨论】:

多年来我一直在为这些错误苦苦挣扎,并且无法用@抑制它们,我从没想过会是我们的自定义错误处理程序会成为罪魁祸首,所以感谢您发布该链接和答案!【参考方案2】:

这可以通过以下方式解决:

ini_set ('gd.jpeg_ignore_warning', 1);

【讨论】:

【参考方案3】:

如果你只是显示图片,那么我建议简单地阅读内容并显示图片如下:

$img = "http://path/to/image";
$contents = file_get_contents($img);
header("Content-Type: image/jpeg");
print($contents);

如果您想将图像复制到您的服务器,您有几个选项,其中两个是copy() 函数或上面使用的方法,然后是fwrite()

选项 1 - copy() 函数,可从 PHP 4 获得

$file1 = "http://path/to/file";
$dest = "/path/to/yourserver/lcoation";
$docopy = copy($file1, $dest);

选项 2 - 使用 file_get_contents()fwrite()

$img = "http://path/to/image";
$contents = file_get_contents($img);
$newfile = "path/to/file.ext";
$fhandler = fopen($newfile, 'w+'); //create if not exists, truncate to 0 length
$write = fwrite($fhandler, $contents); //write image data
$close = fclose($fhandler); //close stream
chmod(0755, $newfile); //make publically readable if you want

我希望你在上面找到一些用处

【讨论】:

如果您最终使用file_get_contents() 方法和fwrite(),您需要实现自己的扩展检查远程文件。如果您使用file_get_contents() 仅显示图像,则需要验证图像扩展并将相关内容类型应用于您的标题。【参考方案4】:

考虑到您想要制作缩略图并保存它,您可以实现一个方便的调整大小功能,如下所示:

<?php
function resize($sourcefile, $endfile, $thumbwidth, $thumbheight, $quality)

    $ext1 = explode(".",trim($sourcefile));
    $ext = strtolower(trim(array_slice($sext1,-1)));

    switch($ext):
        case 'jpg' or 'jpeg':
            $img = imagecreatefromjpeg($sourcefile);
        break;
        case 'gif':
            $img = imagecreatefromgif($sourcefile);
        break;
        case 'png':
            $img = imagecreatefrompng($sourcefile);
        break;
    endswitch;

    $width = imagesx( $img );
    $height = imagesy( $img );

    if ($width > $height) 
        $newwidth = $thumbwidth;
        $divisor = $width / $thumbwidth;
        $newheight = floor( $height / $divisor);
    
    else 
        $newheight = $thumbheight;
        $divisor = $height / $thumbheight;
        $newwidth = floor( $width / $divisor );
    

    // Create a new temporary image.
    $tmpimg = imagecreatetruecolor( $newwidth, $newheight );

    // Copy and resize old image into new image.
    imagecopyresampled( $tmpimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height );

    // Save thumbnail into a file.

    switch($ext):
        case 'jpg' or 'jpeg':
            $makeimg = imagejpeg($tmpimg, $endfile, $quality);
        break;
        case 'gif':
            $makeimg = imagegif($tmpimg, $endfile, $quality);
        break;
        case 'png':
            $makeimg = imagepng($tmpimg, $endfile, $quality);
        break;
    endswitch;

    // release the memory
    imagedestroy($tmpimg);
    imagedestroy($img);

        if($makeimg)
        chmod($endfile,0755);
        return true;
        else
        return false;
        
    
?>

然后,在您使用我在上面的答案中的一种方法将文件复制到您的服务器后,您可以简单地应用以下函数:

$doresize = resize($sourcefile, $endfile, $thumbwidth, $thumbheight, $quality);
echo ($doresize == true ? "IT WORKED" : "IT FAILED");

这个功能非常适合我。我每天将它应用到 1000 张图像上,效果非常棒。

【讨论】:

代码有点错误——在移动到其他内容之前修复了本地副本上的几个拼写错误——似乎是一个有用的功能,但不是复制/粘贴/测试的最佳选择

以上是关于PHP imagecreatefromstring(): gd-jpeg, libjpeg: 可恢复的错误的主要内容,如果未能解决你的问题,请参考以下文章

PHP imagecreatefromstring(): gd-jpeg, libjpeg: 可恢复的错误

imagecreatefromstring 改变图像颜色

php给图片加文字水印

php之把两个图片合成

PHP学习笔记:利用gd库给图片打图片水印

尝试使用 imagecreatefromstring 保存 base64 图像,它完全是黑色的