cocos2dx加载网络图片&图片流加载显示

本文介绍了如何在cocos2dx中实现从网络加载png图片并进行渐进显示,通过libpng库解析interlaced图片,使用回调更新精灵纹理。文章详细阐述了线程通信、线程终止以及内存释放等关键问题的解决方案,并提供了相关代码示例和参考资料。
摘要由CSDN通过智能技术生成
本功能是在后文基础上扩展开发的,添加网络jpg格式图片的支持,添加图片本地缓存功能,可导出至lua中使用;
使用时请添加png头文件搜索路径,如win32下为:$(EngineRoot)external\png\include\win32
扩展后代码github地址:https://github.com/jiutian-mao/ImageStream



------------------------  原文分割线  ----------------------


  • 【动机】

   之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类。

  • 【联想】

之前浏览网页的时候经常看到一张图片渐进(由模糊变清晰)的显示,如果在游戏中,诸如像显示高清卡牌的时候,使用有这种方式去显示一张图片,这样的体验应该会稍微好些

  • 【相关知识】

  png interlaced:png图片在导出的时候是可以选择 interlaced (Adam7)的,这样的存储的png在网页上显示会渐进显示,

      这种interlaced方式是由adam 开发的,分为7段扫描,具体方式如下面的gif图

      

      jpg progressive:在web浏览器上很多都是使用这种模式的图片

  • 【png解码】

   cocos2d-x没有对interlaced模式进行支持,libpng本身肯定是支持的,对interlaced图片png必须使用png_progressive_combine_row来逐行读取,非interlaced的png图片也是一样支持的,libpng解析,首先我们要初始化png_structp,所有解析的信息都在这个结构体里

复制代码
bool PNGCodec::PrepareDecode() {
  png_reader_.png_struct_ptr_= png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
  if (!png_reader_.png_struct_ptr_)
    return false;
  
  png_reader_.png_info_ptr_ = png_create_info_struct(png_reader_.png_struct_ptr_);
  if (!png_reader_.png_info_ptr_) {
    png_destroy_read_struct(&png_reader_.png_struct_ptr_, NULL, NULL);
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值