【问题标题】:PHP test for corrupt (but apparently fine) imagesPHP 测试损坏的(但显然很好)图像
【发布时间】:2011-10-03 13:50:39
【问题描述】:

我有一个使用 SimpleImage.php 的简单图片上传脚本 (http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/) 调整大小并保存上传图像的 2 个副本。

没有大量的验证,只是检查它是否存在以及文件扩展名是否正常,还有一个exif_imagetype(); 调用。

到目前为止,这一直没有问题,直到我尝试上传一个看似正常的 jpeg,结果却是不可见的(并且无法测试?)损坏。它有一些不对劲的地方,但我对图像损坏知之甚少 - 它看起来很好并且在任何东西上都没有打开任何问题,但是当我尝试在我的脚本中保存一个缩放的副本时,我得到了一个白页。

问题肯定出在那个特定的图像上,我已经对来自本地库存和库存图像站点的其他图像进行了详尽的测试,只有一张图像破坏了它。

我使用 Photoshop 调整了副本的大小(预测的文件大小给了我一些奇怪的数字 - 45meg 用于高质量 jpeg)并且上传没有问题。

所以我的问题是,我该如何测试呢?

有问题的图片在这里:http://chinawin.co.uk/broken.jpg //注意,700k

注意:我用类似的分辨率、图像大小和名称进行了测试,除此图像外,其他一切都可以正常工作。

更新: 通过反复试验,我缩小了脚本中断的位置,将图像加载到 SimpleImage 的 var 中。奇怪的是,这是这样做的第二行(第一行是创建大副本,这一行是创建缩略图)。 注释掉它意味着其余的工作正常......也许一些重构可以避免这个问题。

第二次更新: 这是一段代码的 sn-p 和失败行中的一些上下文:

//check if our image is OK
if ($image && $imageThumb) 
{
    //check if image is a jpeg
    if (exif_imagetype($_FILES[$k]['tmp_name']) == IMAGETYPE_JPEG)
    {
        list($width, $height, $type, $attr) = getimagesize($_FILES[$k]['tmp_name']);
        //echo 1;
        $image = new SimpleImage(); 
        //echo 2;               
        $image->load($_FILES[$k]['tmp_name']);      
        //echo 3;
        $imageThumb = new SimpleImage();
        //echo 4;

        //this next line topples my script, but only for that one image - why?:
        $imageThumb->load($_FILES[$k]['tmp_name']);
        //echo '5<br/><br/>-------<br/>';
        //do stuff, save & update db, etc
    }
}

最终编辑: 原来我的脚本内存不足,并且有充分的理由 - 240 ppi 的 4900x3900 图像在加载到内存时约为 48 meg,两次 - 所以我使用的内存可能 > 90meg,per em> 图像。

感谢@Pekka 发现这一点。

将脚本重构为只加载一次图像,然后使用这个变量而不是它的兄弟变量,修复了我的脚本。上传更大(2.5meg)图像时仍然存在(不同)问题,但这是另一个问题。

【问题讨论】:

    标签: php jpeg corrupt


    【解决方案1】:

    这很可能是内存问题:您的 JPG 非常大(超过 4000 x 4000 像素),未经压缩,确实会占用大约 48 MB 的 RAM。

    激活错误报告以确保。如果是这个原因,请参阅例如在这里做什么:Uploading images with PHP and hitting the script memory limit

    【讨论】:

    • 致命错误:第 28 行 /my_path/SimpleImage.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 19600 字节)
    • 谢谢你,找到了根本原因:)
    猜你喜欢
    • 2019-02-13
    • 1970-01-01
    • 2012-04-13
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多