美文网首页
iOS JPEG 显示不完整

iOS JPEG 显示不完整

作者: flexih | 来源:发表于2019-12-12 11:16 被阅读0次

    最近遇到一个图片在iOS上无法显示完整,Android和macOS能显示的情况。问题图片的地址,在📱上显示如果:

    结论

    运营童鞋下载图片的时候出了问题,保存了一个不完整的图片。服务器转码的时候遇到Premature end of JPEG file,转码失败,app上decode失败。此种问题只能通过第三方jpeg库来解决。或许使用libjpeg-turbo是个不错的方案。就像Concorde在README里的说明一样:

    CCBufferedImageDecoder is derived from WebKit, see comments in its file for further copyright details.
    

    流程

    该图片是编辑手动上传的。图片上传到服务器后,会进行转码等处理。服务器日志显示转码失败,在失败的情况下app获取到的是编辑上传的原图。

    现象

    在iOS上无论是app还是Safari里都显示不完整,从图片上看图片分割的地方是出问题的地方。Xcode debug下console里只有Decode Error: -1,没有更多的有效信息。有趣的是Android和macOS都能显示。

    分析

    从iOS SDK里找不到原因,只能尝试使用iOS之外的JPEG库。搜到了libjpeg,libjpeg-turbo和Concorde,从最简单的iOS项目Concorde开始尝试。打开Concorde的example,把图片的地址换成出错图片的地址,运行,图片显示“正常”,没有异常信息。这不科学,一定是遗漏了什么。再研究了一会发现Concorde默认忽略了error message。修改如下方法打印出错误信息:

    METHODDEF(void) my_output_message(j_common_ptr cinfo) {
        char buffer[JMSG_LENGTH_MAX];
    
        /* Create the message */
        (*cinfo->err->format_message) (cinfo, buffer);
    
        fprintf(stderr, "%s\n", buffer);
    }
    

    再运行,得到出错信息:
    Premature end of JPEG file
    但这个问题可以选择尝试读取尽可能多的图片,而不是结束decode。

    参考:
    Concorde
    libjpeg-turbo

    相关文章

      网友评论

          本文标题:iOS JPEG 显示不完整

          本文链接:https://www.haomeiwen.com/subject/bzbzgctx.html