【问题标题】:Premature end of JPEG fileJPEG 文件过早结束
【发布时间】:2012-09-08 11:05:54
【问题描述】:

我在调整某些图像的大小时收到此 JPEG 文件过早结束错误。有趣和奇怪的部分是,只有当我上传任何相机拍摄的图像时,我才会收到这个错误,比如从手机上,除了那些一切都很好。我认为这可能是因为 plupload 中使用的块大小。所以,我上传了更大尺寸的图像到有点像 3mb 来测试。适用于相机拍摄的图像以外的图像。所以,每当我上传相机照片时,我都会收到此错误。

对错误的进一步说明:php 函数 imagecreatefromjpeg 抛出错误“imgname.jpg 不是有效的 JPEG 文件”。

要调整图像大小,我正在使用 Codeigniter 的图像操作类。

【问题讨论】:

    标签: php codeigniter image-processing image-resizing plupload


    【解决方案1】:

    根据你提供的情况,我只能给你我的扣除额。

    相机图像通常非常大。我建议您尝试调整相机图像的大小,看看是否有效。

    您的 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

    【讨论】:

    • 我以前也使用过这个类,但是我在那个类中遇到了同样的错误。基本上这个错误来自两个类中都使用的 imagecreatefromjpeg 函数。 PHP 版本是 5.3.8。另外由于某些原因,我不能使用 Imagick。我的第一个偏好也是如此。
    • 这里的所有建议都不适合我。所以我不得不尝试使用 Imagick,它奏效了。谢谢!
    【解决方案2】:

    如果图像内容不完整,“JPEG 文件过早结束”也是一般软件错误。软件根据最后一个像素的颜色来判断。

    我从 tesseract(开源 OCR 引擎)得到“JPEG 文件提前结束”,因为文件没有通过网络正确复制。

    【讨论】:

      【解决方案3】:

      您是否发现有时当 imagecreatefromjpeg() 在错误的 JPEG 上运行时,它会挂起 php。我发现这是因为 U 使用的 JPEG 文件没有 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;
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以在php.ini中设置gd.jpeg_ignore_warning=1的默认值

        你可以在调用imagecreatefromjpeg()之前在你的PHP脚本中这样设置ini_set('gd.jpeg_ignore_warning', true);

        在实现上述任何一项后,GD 库将忽略它曾经失败的错误,imagecreatefromjpeg() 将返回一个image resource identifier

        注意:在PHP 7.1.0 中,gd.jpeg_ignore_warning 的默认值已从 0 更改为 1

        Reference

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-19
          • 1970-01-01
          • 2011-09-11
          • 2013-11-24
          • 1970-01-01
          • 2018-02-18
          相关资源
          最近更新 更多