游戏项目是基于cocos2d-x开发的,但线上发现一个bug就是玩家在设置完自定义头像后直接闪退。凡是在设置该玩家头像的地方,游戏就直接闪退。最终定位到的问题是图片数据源有问题,我的机器是win7,图片能预览,但同事xp系统该图片是无法预览的,默认的系统自带的图片查看工具也无法显示图片。

把图片拉到sublime text中,查看文件二进制,发现它并非一个完整的jpeg格式

没有jpeg格式的结束标识0xff  0xd9

我在windows下调试代码,发现是在CCImageCommon_cpp.h中的_initWithJpgData方法调用jpeg_finish_decompress函数时程序直接退出了

bool CCImage::_initWithJpgData(void * data, int nSize, bool bNeedDecode /*= false*/){    int nRandomBytes = 0;    if (bNeedDecode) nRandomBytes = RANDOM_BYTES;

    if (bNeedDecode)    {        data = (unsigned char *)data + nRandomBytes;        nSize = nSize - nRandomBytes;    }

    /* these are standard libjpeg structures for reading(decompression) */    struct jpeg_decompress_struct cinfo;    struct jpeg_error_mgr jerr;    /* libjpeg data structure for storing one row, that is, scanline of an image */    JSAMPROW row_pointer[1] = {0};    unsigned long location = 0;    unsigned int i = 0;

    bool bRet = false;    do     {        /* here we set up the standard libjpeg error handler */        cinfo.err = jpeg_std_error( &jerr );

        /* setup decompression process and source, then read JPEG header */        jpeg_create_decompress( &cinfo );

        jpeg_mem_src( &cinfo, (unsigned char *) data, nSize );

        /* reading the image header which contains image information */        jpeg_read_header( &cinfo, true );

        // we only support RGB or grayscale        if (cinfo.jpeg_color_space != JCS_RGB)        {            if (cinfo.jpeg_color_space == JCS_GRAYSCALE || cinfo.jpeg_color_space == JCS_YCbCr)            {                cinfo.out_color_space = JCS_RGB;            }        }        else        {            break;        }

        /* Start decompression jpeg here */        jpeg_start_decompress( &cinfo );

        /* init image info */        m_nWidth  = (short)(cinfo.image_width);        m_nHeight = (short)(cinfo.image_height);        m_bHasAlpha = false;        m_bPreMulti = false;        m_nBitsPerComponent = 8;        row_pointer[0] = new unsigned char[cinfo.output_width*cinfo.output_components];        CC_BREAK_IF(! row_pointer[0]);

        m_pData = new unsigned char[cinfo.output_width*cinfo.output_height*cinfo.output_components];        CC_BREAK_IF(! m_pData);

        /* now actually read the jpeg into the raw buffer */        /* read one scan line at a time */        while( cinfo.output_scanline < cinfo.image_height )        {            jpeg_read_scanlines( &cinfo, row_pointer, 1 );            for( i=0; i<cinfo.image_width*cinfo.output_components;i++)             {                m_pData[location++] = row_pointer[0][i];            }        }

        jpeg_finish_decompress( &cinfo );        jpeg_destroy_decompress( &cinfo );        /* wrap up decompression, destroy objects, free pointers and close open files */                bRet = true;    } while (0);

    CC_SAFE_DELETE_ARRAY(row_pointer[0]);    return bRet;}

后面我用jpegtran(https://github.com/imagemin/jpegtran-bin)工具复制有问题的图片时, 也提示错误了

参考文章:

[1] 小议libjpeg解压损坏文件时的错误处理

[2] JPEG File Layout and Format

解决方案可以参考这篇文章:libjpeg解压损坏文件时的错误处理

转载于:https://www.cnblogs.com/meteoric_cry/p/3998425.html

libjpeg的问题相关推荐

  1. python会搞坏电脑吗_搞python,把原本php环境所需的libjpeg搞坏了

    前面因为搞python,安装过程中,系统默认的libjepg貌似被升级了.从我原有的libjpeg.8升级到了libjpeg.9.结果导致了我的apache没法启动了(一开始并不知道),我原有的php ...

  2. debian9宝塔面板安装php失败,宝塔面板安装php失败:提示No package 'libjpeg' found的解决办法...

    这篇文章主要为大家详细介绍了宝塔面板安装php失败:提示No package 'libjpeg' found的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借 ...

  3. windows下使用cmake编译zlib与libpng libjpeg 留此备份

    win7下使用VS2010编译jpeglib 1.下载源代码下载地址:http://www.ijg.org/files/,     选择最新版本的windows版本压缩包,进行下载.     jpeg ...

  4. 使用libjpeg进行图片压缩(哈夫曼算法,无损压缩)

    Huffman算法也是一种无损压缩算法,但与LZW压缩算法不同,Huffman需要得到每种字符出现概率的先验知识.通过计算字符序列中每种字符出现的频率,为每种字符进行唯一的编码设计,使得频率高的字符占 ...

  5. libjpeg编译使用详解

    一.交叉编译libjpeg # tar -xzvf libjpeg-turbo-1.2.1.tar.gz #cd libjpeg-turbo-1.2.1 #mkdir tmp # ./configur ...

  6. 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )

    文章目录 一. 图片质量压缩方法 二. Skia 二维图形库 三. libjpeg.libpng 函数库引入 在博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供的 ...

  7. 开源库的使用方法以及libjpeg的移植详解

    一.开源库的使用方法 (1)移植(×××.解压.配置.修改Makefile.编译或交叉编译).移植的目的是由源码得到三个东西:动态库.so,静态库.a,头文件.h (2)部署(部署动态库so.部署静态 ...

  8. 图像解码之一——使用libjpeg解码jpeg图片

    多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中.本系列文章将会介绍利用libjpeg解码jpeg文件,libpng解码png文件,libgif解码gif文件.本文为第一篇,介绍使用l ...

  9. android使用的图片压缩格式,Android 之使用libjpeg压缩图片

    一.环境 Android Studio 4.0.1 NDK R15c so包是2.0.6生成的 libturbojpeg.so 二.准备 1.编写native方法并用javah命令生成头文件 obje ...

最新文章

  1. [HDOJ3652]B-Number(数位dp)
  2. 不仅仅是商务旗舰,金立M2017的拍照实力同样给力
  3. oracle tranc,oracle函数trunc的使用
  4. Matplotlib(一)工作流程
  5. ntop网络监控-安装配置指南
  6. 如何在终端编译C++代码
  7. iOS开发——获取本设备IP
  8. 程序默认在副屏显示_树莓派使用 OLED 屏显示图片及文字
  9. MySql noinstall-5.1.34-win32 配置
  10. 火星地形地貌图,摄影:“祝融号”火星车
  11. webpack4学习笔记(一)
  12. 程序设计中为什么要解耦?
  13. SpringCloud Alibaba - Nacos 作为配置中心 读取Yaml配置信息
  14. 5G无线关键技术 — 大规模天线技术
  15. 《杜拉拉升职记》——值得一读的一本好书
  16. 一个大牛对IT人士的忠告
  17. python运行excel宏_从python运行excel宏
  18. pdf编辑导出word软件--Adobe Acrobat XI Pro
  19. 活用Koomail的IMAP协议功能同步Gmail邮件
  20. Aspose.word组件介绍

热门文章

  1. C primer plus -- Chapter 2
  2. C#反射实例No.1
  3. Google发布了Tensorflow Lite,用于移动电话的神经网络库
  4. [Flutter] Android沉侵式标题栏顶部叠加层去除
  5. 单链表的操作_二分查找
  6. python核心编程-第六章-个人笔记(一)
  7. 《信息系统项目管理师软考辅导——3年真题详解与全真模拟》主要创新点、关注点...
  8. 关于spring事务管理
  9. 1.3 计划需求控制
  10. 大数据时代的数据挖掘