文章目录

  • 图片缓存
  • 配置缓存区
  • 缓存与清理
  • 动态图片
  • 参考资料

图片缓存

当图片资源比较大时,一般可能选择放在不可直接地址访问的外置Flash中,此时就需要使用到图片缓存功能。

配置缓存区

  • 核心文件 TouchGFXHAL.cpp
  • 路径: TouchGFX/target/
void TouchGFXHAL::initialize()
{TouchGFXGeneratedHAL::initialize();uint16_t* cacheStartAddr = (uint16_t*)0x60000000;//内置mapped-flashuint32_t cacheSize = 0x2000000;touchgfx::Bitmap::removeCache();//缓存区开始地址,缓存区大小,动态图片缓存最大数量touchgfx::Bitmap::setCache(cacheStartAddr, cacheSize, 256);//touchgfx::Bitmap::cacheAll();//如有需要可以直接开始就全部缓存,但会导致启动缓慢
}

缓存与清理

  • Screen1View.cpp
  • 在进入时缓存当前Screen使用到的图片
//缓存指定图片
void Screen1View::mainScreenBitmapCache()
{Bitmap::cache(BITMAP_WEATHER_34_ID);Bitmap::cache(BITMAP_MAIN_INFO_BACK_ID);
}
//清理
void Screen1View::tearDownScreen()
{Bitmap::clearCache();
}

动态图片

  • 直接生成一张图片数据,可以直接赋予Image显示,依赖于图片缓存配置。
  • 创建使用结束后需要手动释放申请数据空间,每次调用Creat都将重新申请空间,如不释放将会造成严重的内存占用。
  • 图片数据排序:BGRA (Bitmap::ARGB8888)

实例1:生成二维码显示

  const int width = 165;const int height = 161;int side;uint8_t bitdata[QR_MAX_BITDATA];//生成二维码图像数据QRGenerator("http://www.baidu.com", side, bitdata);int i = 0, j = 0, a = 0, l = 0, n = 0;//计算二维码图像缩放比例int OUT_FILE_PIXEL_PRESCALER = 4;OUT_FILE_PIXEL_PRESCALER = width / side;//申请动态图像空间, 宽,高,图像格式bmpID = Bitmap::dynamicBitmapCreate(width, height, Bitmap::ARGB8888);if (bmpID != BITMAP_INVALID){//初始化图像数据memset(Bitmap::dynamicBitmapGetAddress(bmpID), 0xFF, width * height * 4);//获取数据空间地址uint8_t* p = Bitmap::dynamicBitmapGetAddress(bmpID);//二维码数据图像赋值for (i = 0; i < side; i++) {for (j = 0; j < side; j++) {a = j * side + i;if ((bitdata[a / 8] & (1 << (7 - a % 8)))){for (l = 0; l < OUT_FILE_PIXEL_PRESCALER; l++){for (n = 0; n < OUT_FILE_PIXEL_PRESCALER; n++){int qr_x = OUT_FILE_PIXEL_PRESCALER * i + l;int qr_y = OUT_FILE_PIXEL_PRESCALER * (j)+n;p = Bitmap::dynamicBitmapGetAddress(bmpID);p += (qr_x * width + qr_y) * 4;*p = 0x00;//b*(p + 1) = 0x00;//g*(p + 2) = 0x00;//r*(p + 3) = 0xf0;//alpha}}}}}}else{printf("error bitmap\n");}//动态图像附到Image控件image_qr.setBitmap(Bitmap(bmpID));image_qr.setWidthHeight(165, 161);image_qr.invalidate();

实例2:将控件转为图片

 //新建一个动态图像graph_bitmap_id = Bitmap::dynamicBitmapCreate(223, 45, Bitmap::RGB888);if(graph_bitmap_id != BITMAP_INVALID){//初始化图像数据(如果不初始化,会被自动随机生成的数据干扰)memset(Bitmap::dynamicBitmapGetAddress(graph_bitmap_id), 0, 223 * 45 * 3);//将控件图像数据写入到新建的图像空间graph_lone_line.drawToDynamicBitmap(graph_bitmap_id);}else{touchgfx_printf("dynamic bitmap create error\n");return;}//编辑图像数据graph_image_bitmap_id = Bitmap::dynamicBitmapCreate(223, 45, Bitmap::RGB888);if (graph_image_bitmap_id != BITMAP_INVALID){uint8_t* p_argb = Bitmap::dynamicBitmapGetAddress(graph_image_bitmap_id);uint8_t* p_rgb = Bitmap::dynamicBitmapGetAddress(graph_bitmap_id);for (int i = 0; i < 223 * 45 * 3; i += 3){uint8_t b = *p_rgb;uint8_t g = *(p_rgb + 1);uint8_t r = *(p_rgb + 2);if (b != 0 && g != 0 && r != 0){*p_argb = b;//b*(p_argb + 1) = g;//g*(p_argb + 2) = r;//r}else{//background color*p_argb = 0x33;//b*(p_argb + 1) = 0x33;//g*(p_argb + 2) = 0x33;//r}p_argb += 3;p_rgb += 3;}//清除不需要的动态图Bitmap::dynamicBitmapDelete(graph_bitmap_id);}//配置显示graph_image.setBitmap(Bitmap(graph_image_bitmap_id));

参考资料

Caching Bitmap
Dynamic-Bitmaps

Touchgfx - 4 - Bitmap Cache相关推荐

  1. Bitmap Cache

    译文出自谷歌安卓官网图片缓存篇 缓存位图 使用内存缓存Use a Memory Cache 使用磁盘缓存Use a Disk Cache 处理配置发生改变的情况Handle Configuration ...

  2. Bitmap实现照片墙

    Bitmap实现照片墙 Android开发中 位图 的展示 存储 缓存是很重要部分,现代化的用户界面有很多信息都是通过图片形式进行展现,如何更好的展示图片也是衡量一款App 性能和用户体验的重要部分. ...

  3. 关于 android 加载 res 图片 out of memory 问题 解决 同样适用于 sd卡图片

    2019独角兽企业重金招聘Python工程师标准>>> 发现android 加载res图片如果过多也会崩溃 android 也是使用 Bitmap  bm = BitmapFacto ...

  4. java加载图片到缓存_Android实现图片异步加载并缓存到本地

    在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片. 软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下 ...

  5. Android之ListView异步加载网络图片(优化缓存机制)

    网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制 ...

  6. ASimpleCache 轻量级缓存

    0简述 简述为ASimpleCache官网(点击打开链接)对其介绍,ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简而来). ...

  7. Android之图片加载框架Picasso源码解析

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/76645535 本文出自:[顾林海的博客] 个人开发的微信小程序,目前功 ...

  8. 如何修复“ android.os.NetworkOnMainThreadException”?

    运行RssReader的Android项目时出现错误. 码: URL url = new URL(urlToRssFeed); SAXParserFactory factory = SAXParser ...

  9. Android 中加载网络资源时的优化 缓存和异步机制

    网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制 ...

  10. android应用内存分析,Android应用程序内存分析-Memory Analysis for Android Applications

    Android应用程序内存分析 原文链接:http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html ...

最新文章

  1. UI培训分享:如何成为一名优秀的UI设计师
  2. STL中map/vector的删除元素操作
  3. hbuilder/hbuilderx 无法检测到模拟器
  4. 为什么说现在是计算机视觉最好的时代?
  5. Golang之错误处理
  6. 在阿里做博士后是一种怎样的体验?
  7. python输入日期计算天数_用python计算日期(1、返回指定日期所在的一周,2,计算一个日期的月份和天数加减)...
  8. 神奇的判断数组名和指针的区别
  9. java代码着色_给java代码着色源码
  10. fread python有没有_将C的fread转换为python,没有得到预期的输出
  11. 180.连续出现的数字
  12. ionic安卓打印终极解决方案,支持USB打印
  13. PJzhang:贷款逾期与失信被执行人
  14. 推荐一些增长见闻的优质公众号
  15. JSON对象转java对象 JSON数组转LIST数组
  16. Python+Flask框架搭建可视化网站
  17. 无线局域网技术(二)无线传输技术基础
  18. python ip反查询_python ip反查域名
  19. org.apache.tinkerpop.gremlin.driver.exception.ResponseException: Invalid OpProcessor requested [Req
  20. iphone刷机---iphone4s ios8降级ios7.1.1教程

热门文章

  1. 基于Android的医院预约挂号系统
  2. html autoplay属性,HTML autoplay属性用法及代码示例
  3. Leetcode 312 打气球 Burst Balloons C++ 史上最详细题解系列
  4. 网页中无法直接关注微信公众号怎么办?一键唤起微信关注公众号的解决方案
  5. 【FPGA基础】DDR的基本原理介绍,DDR快速上手使用
  6. Buoyant的Conduit服务网格正式成为Linkerd 2
  7. 【Web】HTML(No.06)表格标签经典案例《小说排行榜》
  8. android 输入法判断,Android如何检测输入法键盘是否显示
  9. 计算机虚拟化技术论文,虚拟化技术在计算机技术中的运用
  10. 2018计算机cpu调研,2018最新电脑处理器天梯图,进来了解下