//data: 图片文件数据  dataLen: 文件长度
bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen)
{bool ret = false;do{CC_BREAK_IF(! data || dataLen <= 0);unsigned char* unpackedData = nullptr;ssize_t unpackedLen = 0;//解压缩pvr.ccz格式的图片//detecgt and unzip the compress fileif (ZipUtils::isCCZBuffer(data, dataLen)){unpackedLen = ZipUtils::inflateCCZBuffer(data, dataLen, &unpackedData);}//解压缩pvr.gz格式的图片else if (ZipUtils::isGZipBuffer(data, dataLen)){unpackedLen = ZipUtils::inflateMemory(const_cast<unsigned char*>(data), dataLen, &unpackedData);}else{unpackedData = const_cast<unsigned char*>(data);unpackedLen = dataLen;}//识别文件类型_fileType = detectFormat(unpackedData, unpackedLen);switch (_fileType){case Format::PNG:ret = initWithPngData(unpackedData, unpackedLen);break;...//后面就是根据文件类型来进行图片解码初始化} while (0);return ret;
}

这里先介绍下图片解码到加载再到显示的流程,以后再详细地介绍每种格式图片的解码。

Texture2D * TextureCache::addImage(const std::string &path)
{...//新建一个Image对象image = new (std::nothrow) Image();CC_BREAK_IF(nullptr == image);//图片解码bool bRet = image->initWithImageFile(fullpath);CC_BREAK_IF(!bRet);//新建一个2D的纹理texture = new (std::nothrow) Texture2D();//开始初始化纹理if( texture && texture->initWithImage(image) ){...}
}//使用指定像素格式来初始化(默认是auto,根据图片解码的结果来确定)
bool Texture2D::initWithImage(Image *image, PixelFormat format)
{...//获取当前的OpenGL环境Configuration *conf = Configuration::getInstance();//判断纹理大小是否超出限制int maxTextureSize = conf->getMaxTextureSize();...//获取mipmap贴图的数量if (image->getNumberOfMipmaps() > 1){CCLOG("cocos2d: WARNING: This image has more than 1 mipmaps and we will not convert the data format");//加载mipmap贴图initWithMipmaps(image->getMipmaps(), image->getNumberOfMipmaps(), image->getRenderFormat(), imageWidth, imageHeight);return true;}else if (image->isCompressed()){...initWithData(...)...return true;}else{...initWithData(...)...return true;}
}bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, PixelFormat pixelFormat, int pixelsWide, int pixelsHigh)
{...//设置像素的行字节对齐,在一定平台下有性能的提高,而且若不加注意,会导致glTexImage中系函数的读取越界//Set the row align only when mipmapsNum == 1 and the data is uncompressedif (mipmapsNum == 1 && !info.compressed){unsigned int bytesPerRow = pixelsWide * info.bpp / 8;if(bytesPerRow % 8 == 0){glPixelStorei(GL_UNPACK_ALIGNMENT, 8);}else if(bytesPerRow % 4 == 0){glPixelStorei(GL_UNPACK_ALIGNMENT, 4);}else if(bytesPerRow % 2 == 0){glPixelStorei(GL_UNPACK_ALIGNMENT, 2);}else{glPixelStorei(GL_UNPACK_ALIGNMENT, 1);}}else{glPixelStorei(GL_UNPACK_ALIGNMENT, 1);}...//生成纹理索引glGenTextures(1, &_name);//bindTexture2函数中会调用glActiveTexture,glBindTexture来制定纹理单位和绑定纹理GL::bindTexture2D(_name);//根据mipmap贴图数和是否设置抗锯齿来选择纹理滤波方式,关于纹理滤波的选择后面会详细的再分析下if (mipmapsNum == 1){glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _antialiasEnabled ? GL_LINEAR : GL_NEAREST);}else{glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _antialiasEnabled ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST);}glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, _antialiasEnabled ? GL_LINEAR : GL_NEAREST );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );for (int i = 0; i < mipmapsNum; ++i){unsigned char *data = mipmaps[i].address;GLsizei datalen = mipmaps[i].len;//纹理映射一个指定的纹理图像的一部分到每个开启了纹理映射的图元上。在当前段着色器或顶点着色器使用内建纹理搜索函数时,贴图被启用。if (info.compressed){//压缩格式生成纹理glCompressedTexImage2D(GL_TEXTURE_2D, i, info.internalFormat, (GLsizei)width, (GLsizei)height, 0, datalen, data);}else{//生成2D纹理glTexImage2D(GL_TEXTURE_2D, i, info.internalFormat, (GLsizei)width, (GLsizei)height, 0, info.format, info.type, data);}if (i > 0 && (width != height || ccNextPOT(width) != width )){CCLOG("cocos2d: Texture2D. WARNING. Mipmap level %u is not squared. Texture won't render correctly. width=%d != height=%d", i, width, height);}GLenum err = glGetError();if (err != GL_NO_ERROR){CCLOG("cocos2d: Texture2D: Error uploading compressed texture level: %u . glError: 0x%04X", i, err);return false;}//四分之一大小的mipmapwidth = MAX(width >> 1, 1);height = MAX(height >> 1, 1);}_contentSize = Size((float)pixelsWide, (float)pixelsHigh);_pixelsWide = pixelsWide;_pixelsHigh = pixelsHigh;_pixelFormat = pixelFormat;_maxS = 1;_maxT = 1;//关闭alpha渐变_hasPremultipliedAlpha = false;_hasMipmaps = mipmapsNum > 1;// shadersetGLProgram(GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE));
}

对于非mipmaps的贴图直接指定为已mipmapsNum为1的形式进行初始化即可,纹理纹理渲染完成即可加入到显示队列,当然这里只是先简单介绍下,关于渲染流程等我写完图片的解码部分再回来补充~

未完待续…

cocos2dx的图片加载相关推荐

  1. Cocos2d-x 3.0心得(01)-图片加载与混合模式

    最近开始用cocos2dx 3.0做东西,略有心(cao)得(dian),稍微作下记录吧. v3.0相对v2.2来说,最引人注意的,应该是对触摸层级的优化,和lambda回调函数的引入(嗯嗯,不枉我改 ...

  2. 小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道

    一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片. 问题描述 最近做项目的时候要实现一个上 ...

  3. SDWebImage使用,图片加载和缓存

    本文转载至 http://blog.163.com/wzi_xiang/blog/static/659829612012111402812726/ 清除缓存: [[SDImageCache share ...

  4. Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)

    列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...

  5. Service Worker 图片加载失败处理

    Service Worker 图片加载失败处理 参考文档 git clone https://gitee.com/wjj0720/Service-Worker.git 运行 npm i npm sta ...

  6. Flutter开发之图片加载(九)

    移动开发少不了显示图片,今天就介绍 fluter中如何加载图片,图片加载一般分为本地加载和网络加载. 本地加载 在工程下建一个New Floder 文件夹名:images 将准备好的图片拖到 imag ...

  7. 通用图片加载组件UniversalImageLoader

    通用图片加载组件UniversalImageLoader UniversalImageLoader是一款通用图片加载组件.该组件支持多种图片来源,如网络.SD卡.Assets文件夹等.在网络请求的时候 ...

  8. android 图片加载 软引用_Android 解决图片大量下载:软引用必须懂4点

    1.对象的强.软.弱和虚引用 为了能更加灵活控制对象的生命周期,需要知道对象引用的4中级别,由高到低依次为 :强引用.软引用.弱引用和虚引用 备注: 这四种的区别: ⑴强引用(StrongRefere ...

  9. android 加载进度,Android实现图片加载进度提示

    本文实例为大家分享了Android实现图片加载进度提示的具体代码,供大家参考,具体内容如下 先上图: 实现原理: 第一个控件的实现原理是重写ImageView的onDraw()方法,利用Canvas的 ...

最新文章

  1. Python使用Redis实现IP代理池
  2. 8、web入门回顾/ Http
  3. Scala伴生类和伴生对象
  4. 如何在Cloud for Customer overview UI上扩展新的按钮
  5. 参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图
  6. 【转载保存】Mysql主从同步报错集锦
  7. matlab拟合不显示直线,新人求助一下MATLAB直线拟合问题
  8. 威金蠕虫病毒症状和清除解决方法
  9. c语言倒直角梯形,请问一下大佬们这段代码问题在哪里?
  10. wifidog源码分析 - 初始化阶段
  11. JavaWeb开发基础:Cookies/Session学习
  12. 交流永磁同步电机控制实验平台
  13. 模拟GRE隧道建立过程
  14. 上篇:基于球面调和基的实时全局光照明
  15. Efficient Exchange DP 二维DP
  16. 评职称有什么好处?有以下8点好处
  17. 如何写出“简单“代码?
  18. 代码签名证书_代码签名
  19. 软件开发日语面试自我介绍及问答
  20. 印象笔记客户端的下载和安装、使用(博主推荐)

热门文章

  1. iOS APP发布---版本配置完整流程
  2. 单片机:各类模块数据手册及其资源
  3. 计算机软件基础第二版p,《计算机软件基础(二)》
  4. 迅雷下载的资源,文件夹有大小,但是打开没有文件
  5. html鼠标悬停事件 dw,dw制作鼠标放上去图片就显示鼠标离开图片就消失
  6. 互联网通信基础与Ajax篇
  7. twitter 推出官方 Android 客户端
  8. 1.移动机器人发展现状
  9. 漫谈TCP拥塞控制算法(2)
  10. 微信小程序更改属性值-setData-双向绑定-model