硬汉嵌入式论坛

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

[DMA2D] STM32H7的DMA2D直接显示透明位图的方法,效果很帅

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-4-24 16:09:59 | 显示全部楼层 |阅读模式
测试了Alpha位图绘制函数,比较好用。

位图ARGB8888,大小128*128,显示屏格式RGB565,显示屏分辨率800*480,显示坐标位置位置(2, 1)

_DMA_DrawAlphaBitmap((uint32_t *)(SDRAM_LCD_BUF1+800*2+2*2), (const void *)_aclufei, 128, 128, 0, 800-128, LTDC_PIXEL_FORMAT_RGB565);
1.jpg

使用emWin的BmpCvt转换透明的PNG图标为如下格式,然后直接使用生成的数组即可:
QQ截图20190424161742.jpg

实际显示效果,从ARGB8888转换为RGB565,显示效果就是下面这样的:
QQ截图20190424161642.jpg



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-4-24 16:19:26 | 显示全部楼层
测试函数如下:
  1. /**
  2.   * @brief  Draw alpha bitmap
  3.   * @param  pDst       : Destination buffer
  4.   * @param  pSrc       : Source buffer
  5.   * @param  xSize      : Picture horizontal size
  6.   * @param  ySize      : Picture vertical size
  7.   * @param  OffLineSrc : Source line offset
  8.   * @param  OffLineDst : Destination line offset
  9.   * @param  PixelFormat: Pixel format
  10.   * @retval None
  11.   */
  12. static void _DMA_DrawAlphaBitmap(void * pDst, const void * pSrc, int xSize, int ySize, int OffLineSrc, int OffLineDst, int PixelFormat)
  13. {
  14.   
  15.   /* Setup DMA2D Configuration */
  16.   DMA2D->CR      = 0x00020000UL | (1 << 9);
  17.   DMA2D->FGMAR   = (uint32_t)pSrc;
  18.   DMA2D->BGMAR   = (uint32_t)pDst;
  19.   DMA2D->OMAR    = (uint32_t)pDst;
  20.   DMA2D->FGOR    = OffLineSrc;
  21.   DMA2D->BGOR    = OffLineDst;
  22.   DMA2D->OOR     = OffLineDst;
  23.   DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
  24.   DMA2D->BGPFCCR = PixelFormat;
  25.   DMA2D->OPFCCR  = PixelFormat;
  26.   DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint32_t)ySize;

  27.   /* Start the transfer, and enable the transfer complete IT */
  28.   DMA2D->CR     |= (1|DMA2D_IT_TC);
  29.   
  30.         /* 等待DMA2D传输完成 */
  31.         while (DMA2D->CR & DMA2D_CR_START)
  32.         {
  33.         }
  34.        
  35. }
复制代码


回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
发表于 2020-8-21 13:50:03 | 显示全部楼层
硬汉哥,我现在有很多透明的图标要显示,准备放在sd卡中,然后读取显示,但是直接读取图片,这个函数或者GUI_DrawBitmap之类的函数就没办法用了,有什么好的方法吗?谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-8-21 14:27:26 | 显示全部楼层
gugugui 发表于 2020-8-21 13:50
硬汉哥,我现在有很多透明的图标要显示,准备放在sd卡中,然后读取显示,但是直接读取图片,这个函数或者GU ...

GUI_DrawBitmap支持透明的位图。如果是存在到SD卡之类的外部存储器,你可以使用流位图方式。
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
发表于 2020-8-22 11:31:49 | 显示全部楼层
eric2013 发表于 2020-8-21 14:27
GUI_DrawBitmap支持透明的位图。如果是存在到SD卡之类的外部存储器,你可以使用流位图方式。

谢谢硬汉哥,已经用流位图方式解决了,而且通过论坛里有人分享的bmpcvt批量转换的方式,很方便一次性把图片都转换了 ,谢谢谢谢。而且自己写了个上位机小软件可以把这些.dta的文件名放到一个索引数组了,这样读取sd卡的文件就可以用for循环的方式一次性全部读取了,用的时候直接通过索引号找到对应的位图就行。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 05:15 , Processed in 0.231626 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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