打印
[STM32F4]

【STM32F469I试用】RGB2GRAY

[复制链接]
912|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 wejoncy 于 2016-1-8 09:08 编辑

其实我早已经将所有的代码上传,只是一直没有时间来写一下过程及原理。
帖子地址      https://bbs.21ic.com/icview-1242440-1-1.html
在469中,tft的颜色制式是argb8888,平时,我们显示在上面的图片颜色格式也是基于此的。比如用emwin的工具生成的图片数据。
如果选成其他的格式,比如565,等等。显示的颜色必然不对。

8888相对来说,会浪费大量的内存空间,不过,幸运的是469有16MB的内存,因此,也足够放的下几张图片了。

显示bmp位图


ps(摘录自安福来)


第一种方式 生成C流文件
1、第一步:打开 BmpCvt.exe(位置和前面讲的 GUIBulder 在一个文件夹),并载入图片

2、第二步:做一下格式转换

3、第三步:另存为 C 流文件即可,不过另存的时候要注意


4、
第四步:还有一些其它的格式,大家可以尝试一下,这里我只选择第一个作为实验

5、第五步:然后得到如下的文件,将其放到 SD 卡根目录下即可


GUI_CreateBitmapFromStream()这个函数支持任意格式的流位图创建,可以直接的创建咱们上面生成的流位图

现在如何实现刚才那个 C 流文件的显示呢,我这里用三种方法显示咱们刚才生成的 C 流文件。
 第一步:通过申请动态内存将 C 流文件加载到外部 SRAM, 这里我们用的是外部 2MB 的 SRAM 做

动态内存,方法如下:
/* 申请一块内存空间 并且将其清零 */
hMem = GUI_ALLOC_AllocZero(1024*512);
/* 将申请到内存的句柄转换成指针类型 */
_acBuffer2 = GUI_ALLOC_h2p(hMem);
/* 打开文件 */
result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
if (result != FR_OK)
{
return;
}
result = f_read(&file, _acBuffer2, file.fsize, &bw);
if (result != FR_OK)
{
return;
}
第二步:显示刚才加载到 RAM 中的数据。
RAM 中数据的加载有三种方法,分别如下:
方法一:直接调用函数 GUI_DrawStreamedBitmapAuto(_acBuffer2, 0, 0); 可以显示
方法二:GUI_CreateBitmapFromStream(&Bitmap, &Palette, _acBuffer2);
GUI_DrawBitmap(&Bitmap, 0, 0);
方法三:GUI_CreateBitmapFromStream565(&Bitmap, &Palette, _acBuffer2);
GUI_DrawBitmap(&Bitmap, 0, 0);


另一种显示bmp的方法


gui自动产生
GUI_CONST_STORAGE GUI_BITMAP bm20140406102510816_easyicon_net_96 = {
96, // xSize
96, // ySize
384, // BytesPerLine
32, // BitsPerPixel
(unsigned char *)_ac20140406102510816_easyicon_net_96, // Pointer to picture data
NULL, // Pointer to palette
GUI_DRAW_BMP8888
};
void MainTask(void)
{
GUI_Init();
GUI_DrawBitmap(&bm20140406102510816_easyicon_net_96, 30, 30);
while(1)
{
GUI_Delay(100);
}
}


这是通过emwin显示bmp的几种方法,另外也可以通过st的bsp库来显示。直接读取.bmp文件就可以了吧。


灰度图片
前面说过,469显示的argb8888格式的图片,而平时比如在12864,或灰度tft上显示的是8bit的灰度格式图片。如何在彩色tft上显示灰度呢?

最简单的方法,是的rgb全部相同,显示的就近似灰度

从rgb中任意选取一个颜色,然后让r=g=b。显示,结果为灰度,常常我们选用绿色分量。


更常见的做法,对rgb进行加权平均。

以R、G、B为轴建立空间直角坐标系,则RGB图的每个象素的颜色可以用该三维空间的一个点来表示,
而Gray图的每个象素的颜色可以用直线R=G=B上的一个点来表示。于是rgb转gray图的本质就是寻找
一个三维空间到一维空间的映射,最容易想到的就是射影(即过rgb空间的一个点向直线R=G=B做垂线),
事实上Matlab也是这样做的,并且有Gray = 0.29900 * R + 0.58700 * G + 0.11400 * B。

       灰度可以说是亮度(luminance)的量化值,而RGB的定义是客观的三个波长值,转换时需要考虑人眼对不同波长的灵敏度曲线,所以系数不相等。

以上转载自网网络


虽然469有了浮点运算工具fpu,但是计算的速度仍然远慢于整形,所以

在单片机里我们采用如下运算方式,系数*1024,然后右移10bit,这样快多了。


如果还嫌慢,那就是查表的方式,具体可以看代码



沙发
mmuuss586| | 2016-1-8 13:46 | 只看该作者

呵呵,不错,好好努力;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

168

帖子

3

粉丝