PHP测试损坏(但显然很好)的图像

PHP测试损坏(但显然很好)的图像,php,jpeg,corrupt,Php,Jpeg,Corrupt,我有一个使用SimpleImage.php的简单图像上传脚本 (http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/) 要调整上载图像的大小并保存2份副本,请执行以下操作 没有大量的验证,只是检查它是否存在,文件扩展名是否正确,还有一个exif_imagetype()呼叫 直到我试图上传一个看似普通的jpeg,结果却被证明是不可见的(而且不稳定的?)损坏,这一切都没有问题。这有点不对劲,但我对图像损坏知之甚少——

我有一个使用SimpleImage.php的简单图像上传脚本 (http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/) 要调整上载图像的大小并保存2份副本,请执行以下操作

没有大量的验证,只是检查它是否存在,文件扩展名是否正确,还有一个
exif_imagetype()呼叫

直到我试图上传一个看似普通的jpeg,结果却被证明是不可见的(而且不稳定的?)损坏,这一切都没有问题。这有点不对劲,但我对图像损坏知之甚少——它看起来不错,打开任何东西都没有问题,但当我试图在脚本中保存缩放副本时,我得到了一个白色页面

问题肯定是那个特定的图像,我已经用我本地的股票和股票图像站点的其他图像进行了详尽的测试,只有一个图像破坏了它

我用Photoshop调整了一份拷贝的大小(thingy预测的文件大小给了我一些wierd数字,最高质量的jpeg是45meg),上传时没有问题

所以我的问题是,我如何测试这个

有问题的图片在这里://700k

注意:我已经用类似的分辨率、图像大小和名称进行了测试,除了这张图像,其他一切都正常

更新: 通过反复试验,我缩小了脚本中断的范围,将图像加载到SimpleImage的变量中。奇怪的是,这是第二行(第一行是创建大副本,第二行是创建缩略图)。 注释出来意味着剩下的工作正常。。。也许一些重构可以避免这个问题

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

//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
    }
}
//检查我们的图像是否正常
如果($image&&$imageThumb)
{
//检查图像是否为jpeg格式
if(exif_imagetype($_FILES[$k]['tmp_name'])==imagetype\u JPEG)
{
列表($width、$height、$type、$attr)=getimagesize($\u文件[$k]['tmp\u名称]);
//回声1;
$image=新的SimpleImage();
//回声2;
$image->load($_文件[$k]['tmp_名称']);
//回声3;
$imageThumb=新建SimpleImage();
//回声4;
//下一行推翻了我的脚本,但只针对那一幅图像-为什么
$imageThumb->load($_文件[$k]['tmp_名称']);
//回音“5

----
”; //做一些事情,保存和更新数据库,等等 } }
最终编辑: 结果是我的脚本内存不足,并且有很好的理由-4900x3900图像和240 ppi在加载到内存中时,结果是48兆左右,两次-所以我可能每个图像使用>90兆的ram

向@Pekka致敬,因为他发现了这一点


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

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


激活错误报告以确保。如果是原因,请参见此处的操作:

致命错误:在第28行的/my_path/SimpleImage.php中,允许的内存大小为134217728字节(试图分配19600字节)。为此,请找到根本原因:)