硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4084|回复: 2
收起左侧

[emWin教程入门篇] 【STemWin教程】第9章 2-D图形库之绘制流位图

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-1-12 11:18:02 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第9章      2-D图形库之绘制流位图

    本期主要讲解2-D图形库的绘制流位图,与C文件格式的位图相反,流位图可放在任何位置。位图流可用于创建位图。这些位图可按与C文件格式位图相同的方式使用。此外,emWin支持直接绘制基于调色板的位图流,而不必在可寻址区域(RAM或ROM)放置完整的图像。
    9. 1  生成C流文件
    9. 2  开发板上实现流位图
    9. 3  实验总结
9.1  生成C流文件
    C流文件由与C文件相同的信息组成。它与C文件相反,数据流可位于任何地方,无需编译或与项目链接。C文件支持的所有输出格式对C流文件也可用。emWin支持从数据流创建位图并直接绘制数据流
    这里顺便说一下压缩位图,这个可看可不看,位图转换器和emWin支持在生成的源代码文件中对位图进行游程编码(RLE)压缩。如果位图包含许多水平序列的等着色像素,则RLE压缩方法最有效。高效压缩的位图将节省大量的空间。但是,不建议对摄影图像进行压缩,因为它们通常不具有相同像素的序列。也应注意,压缩图像的显示时间会稍微更长。如果要保存使用RLE压缩的位图,可在另存为C文件时,选择一种压缩输出格式:“带调色板的C,压缩”或 “不带调色板的C,压缩”。显示压缩位图无需特殊功能;与显示不压缩位图的方法相同。
    获得的压缩比将随所用位图的不同而不同。图像水平均匀性越好,压缩比越高。每个像素的位数越高,产生压缩比也越高。下面我们以下面的图片为例子生成C流文件。
    下面我们以下面的图片为例子生成C流文件。
9.1.png


l 第一步:打开BmpCvt.exe(位置和前面讲的GUIBulder在一个文件夹),并载入图片
9.2.jpg


l 第二步:做一下格式转换
9.3.jpg


l 第三步:另存为C流文件即可,不过另存的时候要注意
9.4.png


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


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


9.2  开发板上实现流位图
    下面是流位图当前支持的格式:
9.7.png


    GUI_CreateBitmapFromStream()这个函数支持任意格式的流位图创建,可以直接的创建咱们上面生成的流位图,如果知道流位图的格式,那么可以直接的调用特定的函数,当前支持的函数如下:
9.8.png


    这个东西该怎么的理解呢,这里举一个例子,咱们上面生成的那个C流文件是转换成了565格式,这里我们就可以使用函数GUI_CreateBitmapFromStream(),这个函数不管你转换成什么格式了,都可以创建的,还有一个就是GUI_CreateBitmapFromStream565(), 这个就是特定格式的转换,正好用在咱们上面转换好的C流文件。
    现在如何实现刚才那个C流文件的显示呢,我这里用三种方法显示咱们刚才生成的C流文件。
l  第一步:通过申请动态内存将C流文件加载到外部SRAM, 这里我们用的是外部2MB的SRAM做的动态内存,方法如下:
  1. /* 申请一块内存空间 并且将其清零 */
  2. hMem = GUI_ALLOC_AllocZero(1024*512);
  3.      /* 将申请到内存的句柄转换成指针类型 */
  4.      _acBuffer2 = GUI_ALLOC_h2p(hMem);
  5.    
  6.      /* 打开文件 */        
  7.      result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
  8.      if (result != FR_OK)
  9.      {
  10.          return;
  11.      }
  12.      result = f_read(&file, _acBuffer2, file.fsize, &bw);
  13.      if (result != FR_OK)
  14.      {
  15.          return;
  16.      }
复制代码
l  第二步:显示刚才加载到RAM中的数据。
     RAM中数据的加载有三种方法,分别如下:
方法一:直接调用函数 GUI_DrawStreamedBitmapAuto(_acBuffer2, 0, 0); 可以显示
方法二:GUI_CreateBitmapFromStream(&Bitmap,&ampalette, _acBuffer2);
                GUI_DrawBitmap(&Bitmap, 0, 0);
方法三:GUI_CreateBitmapFromStream565(&Bitmap,&ampalette, _acBuffer2);
                GUI_DrawBitmap(&Bitmap, 0, 0);
实际运行代码如下:
  1. #include "includes.h"
  2. #include "MainTask.h"
  3. #define Method3  /* 用于选择使用的显示方法 */
  4. /*
  5. *********************************************************************************************************
  6. *    函 数 名: _ShowStreamBitmap
  7. *    功能说明: 显示流位图
  8. *    形    参:sFilename  要读取的文件名
  9. *    返 回 值: 无
  10. *********************************************************************************************************
  11. */
  12. static void _ShowStreamBitmap(const char * sFilename)
  13. {
  14.      GUI_HMEM hMem;
  15.      char *_acBuffer2;
  16.      BUTTON_Handle hButton;
  17. GUI_BITMAP Bitmap;
  18.     GUI_LOGPALETTE Palette;
  19.     /* 创建一个按钮 */
  20.     hButton = BUTTON_Create(200, 200, 300, 200, GUI_ID_OK, WM_CF_SHOW);
  21.      /* 申请一块内存空间 并且将其清零    */
  22.     hMem = GUI_ALLOC_AllocZero(1024*512);
  23.      /* 将申请到内存的句柄转换成指针类型 */
  24.      _acBuffer2 = GUI_ALLOC_h2p(hMem);
  25.    
  26.      /* 打开文件 */        
  27.      result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
  28.      if (result != FR_OK)
  29.      {
  30.          return;
  31.      }
  32.      /* 读取文件到动态内存 */
  33.      result = f_read(&file, _acBuffer2, file.fsize, &bw);
  34.      if (result != FR_OK)
  35.      {
  36.          return;
  37.      }
  38.      /* 显示方法一 */
  39. #if defined Method1
  40.      GUI_DrawStreamedBitmapAuto(_acBuffer2, 15, 15);
  41.    
  42.      /* 显示方法二 */
  43. #elif defined Method2
  44.     GUI_CreateBitmapFromStream(&Bitmap, &Palette, _acBuffer2);
  45.      GUI_DrawBitmap(&Bitmap, 15, 15);
  46.    
  47.      /* 显示方法三 */
  48. #elif defined Method3
  49.      GUI_CreateBitmapFromStream565(&Bitmap, &Palette, _acBuffer2);
  50.      GUI_DrawBitmap(&Bitmap, 15, 15);
  51. #endif
  52.      /* 下面几个函数没有调试出来,留作以后调试 */
  53. //   BUTTON_SetStreamedBitmap(hButton, BUTTON_CI_UNPRESSED, (const GUI_BITMAP_STREAM *)&Bitmap);
  54. //  BUTTON_SetBitmap(hButton, BUTTON_BI_UNPRESSED, &Bitmap);
  55. //   BUTTON_SetStreamedBitmapEx(hButton, BUTTON_BI_UNPRESSED, (const GUI_BITMAP_STREAM *)&Bitmap,0,0);
  56.    
  57.     /* 释放动态内存 */   
  58.      GUI_ALLOC_Free(hMem);
  59.      f_close(&file);
  60. }
  61. /*
  62. *********************************************************************************************************
  63. *    函 数 名: MainTask
  64. *    功能说明: GUI主函数
  65. *    形    参:无
  66. *    返 回 值: 无
  67. *********************************************************************************************************
  68. */
  69. void MainTask(void)
  70. {   
  71.      GUI_Init();
  72.      /* 设置皮肤函数 */
  73.      PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  74.      FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  75.      PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  76.      BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  77.      CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  78.      DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  79.      SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  80.      SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  81.      HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  82.      RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  83.      /* 读取并显示文件 */
  84.      _ShowStreamBitmap("logo.dta");
  85.      while(1)
  86.      {                 
  87.          GUI_Delay(100);      
  88.      }
  89. }
复制代码
显示效果如下:
9.9.png


9.3  实验总结
     流位图在一些应用中比较有用,比如要在按钮上面显示图片,我们不需要将其用位图转换器转换成相应的C文件,并下载到内部flash进行显示,我们可以将其放到外部SD,flash等存储器进行加载显示,这个实验尝试了一下在按钮上面显示,就是显示不出来,后面有时间再做尝试。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-1-12 11:45:53 | 显示全部楼层
自己坐个沙发~~
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

0

主题

19

回帖

0

积分

新手上路

积分
0
QQ
发表于 2016-10-15 17:14:39 | 显示全部楼层
[s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-1 19:35 , Processed in 0.218694 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表