你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[原创] 【安富莱STemWin教程】第9章 2-D图形库之绘制流...

[复制链接]
baiyongbin2009 发布时间:2015-1-13 16:43
本帖最后由 baiyongbin2009 于 2015-1-13 16:45 编辑

特别说明:完整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,&Palette, _acBuffer2);
                GUI_DrawBitmap(&Bitmap, 0, 0);
方法三:GUI_CreateBitmapFromStream565(&Bitmap,&Palette, _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等存储器进行加载显示,这个实验尝试了一下在按钮上面显示,就是显示不出来,后面有时间再做尝试。



收藏 1 评论0 发布时间:2015-1-13 16:43

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版