Touchgfx - 4 - Bitmap Cache
文章目录
- 图片缓存
- 配置缓存区
- 缓存与清理
- 动态图片
- 参考资料
图片缓存
当图片资源比较大时,一般可能选择放在不可直接地址访问的外置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相关推荐
- Bitmap Cache
译文出自谷歌安卓官网图片缓存篇 缓存位图 使用内存缓存Use a Memory Cache 使用磁盘缓存Use a Disk Cache 处理配置发生改变的情况Handle Configuration ...
- Bitmap实现照片墙
Bitmap实现照片墙 Android开发中 位图 的展示 存储 缓存是很重要部分,现代化的用户界面有很多信息都是通过图片形式进行展现,如何更好的展示图片也是衡量一款App 性能和用户体验的重要部分. ...
- 关于 android 加载 res 图片 out of memory 问题 解决 同样适用于 sd卡图片
2019独角兽企业重金招聘Python工程师标准>>> 发现android 加载res图片如果过多也会崩溃 android 也是使用 Bitmap bm = BitmapFacto ...
- java加载图片到缓存_Android实现图片异步加载并缓存到本地
在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片. 软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下 ...
- Android之ListView异步加载网络图片(优化缓存机制)
网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制 ...
- ASimpleCache 轻量级缓存
0简述 简述为ASimpleCache官网(点击打开链接)对其介绍,ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简而来). ...
- Android之图片加载框架Picasso源码解析
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/76645535 本文出自:[顾林海的博客] 个人开发的微信小程序,目前功 ...
- 如何修复“ android.os.NetworkOnMainThreadException”?
运行RssReader的Android项目时出现错误. 码: URL url = new URL(urlToRssFeed); SAXParserFactory factory = SAXParser ...
- Android 中加载网络资源时的优化 缓存和异步机制
网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制 ...
- android应用内存分析,Android应用程序内存分析-Memory Analysis for Android Applications
Android应用程序内存分析 原文链接:http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html ...
最新文章
- UI培训分享:如何成为一名优秀的UI设计师
- STL中map/vector的删除元素操作
- hbuilder/hbuilderx 无法检测到模拟器
- 为什么说现在是计算机视觉最好的时代?
- Golang之错误处理
- 在阿里做博士后是一种怎样的体验?
- python输入日期计算天数_用python计算日期(1、返回指定日期所在的一周,2,计算一个日期的月份和天数加减)...
- 神奇的判断数组名和指针的区别
- java代码着色_给java代码着色源码
- fread python有没有_将C的fread转换为python,没有得到预期的输出
- 180.连续出现的数字
- ionic安卓打印终极解决方案,支持USB打印
- PJzhang:贷款逾期与失信被执行人
- 推荐一些增长见闻的优质公众号
- JSON对象转java对象 JSON数组转LIST数组
- Python+Flask框架搭建可视化网站
- 无线局域网技术(二)无线传输技术基础
- python ip反查询_python ip反查域名
- org.apache.tinkerpop.gremlin.driver.exception.ResponseException: Invalid OpProcessor requested [Req
- iphone刷机---iphone4s ios8降级ios7.1.1教程
热门文章
- 基于Android的医院预约挂号系统
- html autoplay属性,HTML autoplay属性用法及代码示例
- Leetcode 312 打气球 Burst Balloons C++ 史上最详细题解系列
- 网页中无法直接关注微信公众号怎么办?一键唤起微信关注公众号的解决方案
- 【FPGA基础】DDR的基本原理介绍,DDR快速上手使用
- Buoyant的Conduit服务网格正式成为Linkerd 2
- 【Web】HTML(No.06)表格标签经典案例《小说排行榜》
- android 输入法判断,Android如何检测输入法键盘是否显示
- 计算机虚拟化技术论文,虚拟化技术在计算机技术中的运用
- 2018计算机cpu调研,2018最新电脑处理器天梯图,进来了解下