我在调整某些图像大小时遇到了JPEG文件错误的过早结束。有趣和奇怪的部分是,我只是在上传任何相机拍摄的图像时才会收到此错误,例如来自移动设备,除了那些每件事情都很棒。我认为这可能是因为plupload中使用的块大小。所以,我上传了更大尺寸的图像,有点像3mb测试。与相机拍摄图像以外的图像一起使用。因此,每当我上传相机照片时,我都会收到此错误。
关于错误的进一步阐述:php函数imagecreatefromjpeg抛出一个错误“imgname.jpg不是一个有效的JPEG文件”。
要调整图像大小我正在使用Codeigniter的图像操作类。
答案 0 :(得分:2)
根据您提供的内容,我只能给您扣除。
相机图像通常非常大。我建议您尝试调整相机图像的大小,看看它是否有效。
你的PHP版本是什么?有一个与此相关的错误:https://bugs.php.net/bug.php?id=29878
还请检查您的JPEG文件是否为RGB格式。手册中的某处提到它无法为某些版本的GD库正确加载CMYK。
您是否愿意使用其他课程?我使用this class来调整图像大小,并且多年来没有遇到任何问题。
调整图像大小非常简单:
<?php
include('SimpleImage.php');
$image = new SimpleImage();
$image->load('picture.jpg');
$image->resizeToHeight(500);
$image->save('picture2.jpg');
$image->resizeToHeight(200);
$image->save('picture3.jpg');
?>
如果所有建议都无效,您可以尝试使用ImageMagick。
答案 1 :(得分:2)
你是否发现有时它会在imagecreatefromjpeg()在错误的JPEG上运行时挂起php。我发现这是因为JPEG文件U使用没有EOI(图像结束) JPEG结尾处的FF D9
JPEG图像应以0xFFD8开头,以0xFFD9
结束// this may help to fix the error
function check_jpeg($f, $fix=false )
{
# check for jpeg file header and footer - also try to fix it
if ( false !== (@$fd = fopen($f, 'r+b' )) ){
if ( fread($fd,2)==chr(255).chr(216) ){
fseek ( $fd, -2, SEEK_END );
if ( fread($fd,2)==chr(255).chr(217) ){
fclose($fd);
return true;
}else{
if ( $fix && fwrite($fd,chr(255).chr(217)) ){return true;}
fclose($fd);
return false;
}
}else{fclose($fd); return false;}
}else{
return false;
}
}
答案 2 :(得分:1)
此外,“JPEG文件过早结束”如果图像内容不完整,则是一般软件错误。软件通过最后一个像素的颜色来确定它。
我从tesseract(开源OCR引擎)得到'过早结束JPEG文件',因为文件没有通过网络正确复制。
答案 3 :(得分:1)
您可以在gd.jpeg_ignore_warning=1
php.ini
的默认值
OR
在调用ini_set('gd.jpeg_ignore_warning', true);
imagecreatefromjpeg()
执行上述任何一项后,GD库将忽略用于失败的错误,imagecreatefromjpeg()
将返回image resource identifier
。
注意:在PHP 7.1.0
中,gd.jpeg_ignore_warning
的默认值已从0
更改为1
。
<强> Reference 强>