硬汉嵌入式论坛

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

[emWin] 重要说明,使用存储设备绘制透明图片,透明部分都是黑色背景解决办法

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 00:47:00 | 显示全部楼层 |阅读模式
测试条件说明:
比如我们要显示下面的图片:

1.png

测试函数如下:
  1. GUI_HMEM hMemPNG;
  2.         
  3. hMemPNG = GUI_MEMDEV_CreateEx(0, 0, 96, 96, GUI_MEMDEV_HASTRANS);  /* 将PNG格式图片加载到存储设备里面 */
  4. GUI_MEMDEV_Select(hMemPNG);
  5. GUI_PNG_Draw(_ac1, 12721UL + 1, 0, 0);
  6. GUI_MEMDEV_Select(0);

  7. GUI_MEMDEV_WriteAt(hMemPNG, 10, 120);     /* 调用显示  */
复制代码

测试出来是下面这种效果,显然不是我们想要的:
QQ截图20180808004628.png

解决办法也比较简单
1、首先要保证你的图片是带透明通道的,无论是BMP还是PNG,一定要是ARGB8888的。是否透明,使用emWin自带的小软件BmpCvt一看便知,比如我们测试的这个
QQ截图20180808005035.png

2、创建的存储设备使用32位颜色格式,即GUI_MEMDEV_CreateFixed(x, x, x, x, GUI_MEMDEV_HASTRANS,  GUI_MEMDEV_APILIST_32,  GUI_COLOR_CONV_8888);

3、绘制的时候,设置背景色为GUI_SetBkColor(GUI_TRANSPARENT)。

完整的代码如下:
  1. GUI_HMEM hMemPNG;
  2.         
  3.         hMemPNG = GUI_MEMDEV_CreateFixed(0, 0, 100, 100, GUI_MEMDEV_HASTRANS, GUI_MEMDEV_APILIST_32, GUI_COLOR_CONV_8888);

  4.     GUI_MEMDEV_Select(hMemPNG);
  5.         GUI_SetBkColor(GUI_TRANSPARENT);
  6.         GUI_Clear();
  7.     GUI_PNG_Draw(_ac1, 12721UL + 1, 0, 0);
  8.     GUI_MEMDEV_Select(0);
  9.         
  10.         GUI_MEMDEV_WriteAt(hMemPNG, 10, 120);
复制代码

测试效果如下,已经完全正常:
555.png




最后附上四张带透明效果的PNG图片供大家测试:

四张PNG格式图片,带透明效果.7z (48.97 KB, 下载次数: 220)




评分

参与人数 2金币 +40 收起 理由
loliko + 20 很给力!
byccc + 20

查看全部评分

回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-8-8 14:18:55 | 显示全部楼层
这坑人问题终于解决了,666
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
发表于 2018-8-8 15:16:04 | 显示全部楼层
谢谢老师,刚好用上
回复

使用道具 举报

19

主题

31

回帖

88

积分

初级会员

积分
88
发表于 2018-8-10 17:32:56 | 显示全部楼层
好东西,之前就遇到过没有解决,这次可以优化一下了
回复

使用道具 举报

17

主题

70

回帖

121

积分

初级会员

积分
121
发表于 2018-8-10 18:14:20 | 显示全部楼层
ddddddddddddddd
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2020-12-17 11:13:02 | 显示全部楼层
请问下565颜色也这个代码也能行吗?
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2020-12-17 11:14:14 | 显示全部楼层
请问下我emwin565颜色,用这代码显示是一坨黑色方块,是怎么回事?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-12-18 09:40:09 | 显示全部楼层
Nick333 发表于 2020-12-17 11:14
请问下我emwin565颜色,用这代码显示是一坨黑色方块,是怎么回事?

可以考虑使用BmpCvt小软件生成带alpha通道的RGB565格式位图测试看看
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-3-19 01:39:25 | 显示全部楼层
GUI_MEMDEV_Select(hMemPNG);
GUI_SetBkColor(GUI_TRANSPARENT);
GUI_Clear();
GUI_DrawBitmap(&bmClockHand_Second_2x210, 390>>1, 390>>1);
GUI_MEMDEV_Select(0);

GUI_MEMDEV_Select(hMemDST);
GUI_SetBkColor(GUI_RED);
GUI_Clear();
GUI_MEMDEV_Rotate(hMemPNG, hMemDST, 0, 0, 60 * 1000, 1000);
GUI_MEMDEV_Select(0);
GUI_MEMDEV_WriteAt(hMemDST, 0, 0);
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2024-4-2 18:29:16 | 显示全部楼层
eric2013 发表于 2020-12-18 09:40
可以考虑使用BmpCvt小软件生成带alpha通道的RGB565格式位图测试看看

硬汉哥,我现在使用最新的emWin6.38版本,LCD是RGB565格式,本来想实现《第57章 emWin6.x的炫酷时钟表盘设计》,现在使用8888和565格式的存储设备都无法实现透明效果,代码和显示效果见图。
emwin.png
LCD.jpg
bitmap.png
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2024-4-2 22:41:34 | 显示全部楼层
刚才把工程的emWin版本从6.38换回到6.16,其他代码没变。现在透明色又是正常的了,想问下emWin6.38版本怎么实现存储设备的透明色显示呢,是新版本的实现方式有变化吗?
LCD.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2024-4-3 08:22:09 | 显示全部楼层
putin 发表于 2024-4-2 22:41
刚才把工程的emWin版本从6.38换回到6.16,其他代码没变。现在透明色又是正常的了,想问下emWin6.38版本怎么 ...

emWin6.38颜色格式库是ARGB8888,而你使用的6.16应该是ABGR8888
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2024-4-3 09:38:01 | 显示全部楼层
eric2013 发表于 2024-4-3 08:22
emWin6.38颜色格式库是ARGB8888,而你使用的6.16应该是ABGR8888

谢谢硬汉哥,知道该怎么做了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 11:55 , Processed in 0.237590 second(s), 37 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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