流霞地

iOS JPEG 显示不完整

最近遇到一个图片在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。

参考: