libjpeg的问题
游戏项目是基于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的问题相关推荐
- python会搞坏电脑吗_搞python,把原本php环境所需的libjpeg搞坏了
前面因为搞python,安装过程中,系统默认的libjepg貌似被升级了.从我原有的libjpeg.8升级到了libjpeg.9.结果导致了我的apache没法启动了(一开始并不知道),我原有的php ...
- debian9宝塔面板安装php失败,宝塔面板安装php失败:提示No package 'libjpeg' found的解决办法...
这篇文章主要为大家详细介绍了宝塔面板安装php失败:提示No package 'libjpeg' found的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借 ...
- windows下使用cmake编译zlib与libpng libjpeg 留此备份
win7下使用VS2010编译jpeglib 1.下载源代码下载地址:http://www.ijg.org/files/, 选择最新版本的windows版本压缩包,进行下载. jpeg ...
- 使用libjpeg进行图片压缩(哈夫曼算法,无损压缩)
Huffman算法也是一种无损压缩算法,但与LZW压缩算法不同,Huffman需要得到每种字符出现概率的先验知识.通过计算字符序列中每种字符出现的频率,为每种字符进行唯一的编码设计,使得频率高的字符占 ...
- libjpeg编译使用详解
一.交叉编译libjpeg # tar -xzvf libjpeg-turbo-1.2.1.tar.gz #cd libjpeg-turbo-1.2.1 #mkdir tmp # ./configur ...
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )
文章目录 一. 图片质量压缩方法 二. Skia 二维图形库 三. libjpeg.libpng 函数库引入 在博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供的 ...
- 开源库的使用方法以及libjpeg的移植详解
一.开源库的使用方法 (1)移植(×××.解压.配置.修改Makefile.编译或交叉编译).移植的目的是由源码得到三个东西:动态库.so,静态库.a,头文件.h (2)部署(部署动态库so.部署静态 ...
- 图像解码之一——使用libjpeg解码jpeg图片
多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中.本系列文章将会介绍利用libjpeg解码jpeg文件,libpng解码png文件,libgif解码gif文件.本文为第一篇,介绍使用l ...
- android使用的图片压缩格式,Android 之使用libjpeg压缩图片
一.环境 Android Studio 4.0.1 NDK R15c so包是2.0.6生成的 libturbojpeg.so 二.准备 1.编写native方法并用javah命令生成头文件 obje ...
最新文章
- [HDOJ3652]B-Number(数位dp)
- 不仅仅是商务旗舰,金立M2017的拍照实力同样给力
- oracle tranc,oracle函数trunc的使用
- Matplotlib(一)工作流程
- ntop网络监控-安装配置指南
- 如何在终端编译C++代码
- iOS开发——获取本设备IP
- 程序默认在副屏显示_树莓派使用 OLED 屏显示图片及文字
- MySql noinstall-5.1.34-win32 配置
- 火星地形地貌图,摄影:“祝融号”火星车
- webpack4学习笔记(一)
- 程序设计中为什么要解耦?
- SpringCloud Alibaba - Nacos 作为配置中心 读取Yaml配置信息
- 5G无线关键技术 — 大规模天线技术
- 《杜拉拉升职记》——值得一读的一本好书
- 一个大牛对IT人士的忠告
- python运行excel宏_从python运行excel宏
- pdf编辑导出word软件--Adobe Acrobat XI Pro
- 活用Koomail的IMAP协议功能同步Gmail邮件
- Aspose.word组件介绍