博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libjpeg的问题
阅读量:6607 次
发布时间:2019-06-24

本文共 2594 字,大约阅读时间需要 8 分钟。

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

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

image

没有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

后面我用jpegtran()工具复制有问题的图片时, 也提示错误了

image

 

参考文章:

[1]

[2]

解决方案可以参考这篇文章:

转载地址:http://lqiso.baihongyu.com/

你可能感兴趣的文章
《Node.js区块链开发》一3.6 总结
查看>>
《UG NX8.0中文版完全自学手册》一2.8 布尔运算
查看>>
移动阅读时代“长文章”生存状态调查
查看>>
springboot docker笔记
查看>>
跟我一起学QT3:电子表格的制作
查看>>
mysql char和varchar区别
查看>>
Modbus RTU 通信工具设计
查看>>
服务化改造实践 | 如何在 Dubbo 中支持 REST
查看>>
Logwatch linux日志监视器解析
查看>>
【第8章】JVM内存管理
查看>>
在绿色的河流上
查看>>
ovirt官方安装文档 附录G
查看>>
磁盘故障小案例
查看>>
了解相关.NET Framework不同组件区别及安装知识
查看>>
ToughRADIUS快速指南
查看>>
Kubernetes+Prometheus+Grafana部署笔记
查看>>
linux磁盘管理基本命令
查看>>
HTML
查看>>
【转】左手坐标系和右手坐标系
查看>>
我的友情链接
查看>>