正确组合StretchBlt和TransparentBlt,以便可以正确创建透明位图

AlwaysLearningNewStuff

简介和相关信息:

最近,我在SO中问了一个有关正确缩放位图的问题,以便它可以保持图片质量:

在按钮背景上拉伸/缩小时,位图会失去质量

我尝试使用注释中的建议来使用`StretchBlt,因此我制作了一个小型演示程序。

在将拉伸模式设置为后,它确实提高了位图的清晰度BLACKONWHITE

我想尝试使用某些颜色(例如黑色)使位图的一部分透明。

我以前使用过TransparentBlt,但现在不知道该怎么做。

问题:

为了保持图像的清晰度,我需要StretchBlt在内存DC中使用它,拉伸模式为BLACKONWHITE

问题是我不知道如何Blt透明地其插入主窗口的DC。

这是演示应用程序中的代码片段:

    case WM_PAINT:
         {
              // main window's DC

              hdc = BeginPaint(hWnd, &ps);

              // main window's client rectangle

              RECT r;

              GetClientRect( hWnd, &r );

              // memory DC for double buffering

              HDC MemDC = CreateCompatibleDC( hdc );

              // fill it with test brush

              FillRect( MemDC, &r, (HBRUSH)GetStockObject( GRAY_BRUSH ) );

              // select loaded bitmap into memory DC

              HBITMAP old = (HBITMAP)SelectObject( MemDC, bmp );

              // get bitmaps dimensions

              BITMAP b;

              GetObject( bmp, sizeof(BITMAP), &b );

              //  needed to preserve bitmap's sharpness

              SetStretchBltMode( hdc, BLACKONWHITE );

              StretchBlt( hdc, 0, 0, r.right - r.left, r.bottom - r.top, 
                             MemDC, 0, 0, b.bmWidth, b.bmHeight, SRCCOPY );

              /* TransparentBlt( ... ); call should go here, 

                 so I can make portion of the bitmap transparent,

                 in order for the gray brush can be seen */

              // cleanup

              SelectObject( MemDC, old );

              DeleteDC(MemDC);

              EndPaint(hWnd, &ps);

         }
         return 0L;
         break;

题:

如何修改上面的代码,以便位图可以透明,以便可以看到测试笔刷?

原始图像如下。

在此处输入图片说明

我只需要使用TransparentBlt( ..., RGB( 0, 0, 0 ) );使其在黑色区域透明即可。

显示结果的示例图片:

在此处输入图片说明

我的努力:

通过Internet浏览,我只找到了有关双重缓冲的简单教程。

我还没有找到类似的东西,但是老实说,我对WIN32 API经验不足,所以我不知道如何正确地表达问题,以便获得更好的搜索结果。

如果需要更多信息,请索取,我会提供。

为了使问题简短,将其省略。

xMRi

您需要使用特定的栅格操作来创建遮罩,以仅复制定义了遮罩的像素。http://www.winprog.org/tutorial/transparency.html

下一个代码是MFC,但是您可以轻松地将MFC对象提取并将其转换为Standard GDI操作。http://www.codeproject.com/Articles/703/Drawing-Transparent-Bitmap-with-ease-with-on-the-f

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何创建静态类的实例,以便可以从单独的类中调用它?

来自分类Dev

如何从DefaultModelList创建列表,以便可以使用JAXB编组为XML?

来自分类Dev

为TeamCity插件放置属性文件以便可以轻松编辑的正确位置是什么?

来自分类Dev

如何在GLSL中正确声明统一的结构数组,以便可以将UBO指向它?

来自分类Dev

如何创建密钥和机密,以便可以发布到存储桶?

来自分类Dev

gradle如何选择某些URL查找存储库?如何将其指向正确的方向,以便可以导入此JAR?

来自分类Dev

如何正确授权Azure用户帐户,以便它可以创建服务主体?

来自分类Dev

Windows应用商店-RenderTargetBitmap创建大小不正确的位图

来自分类Dev

如何正确地将C结构写入磁盘上的文件,以便可以在其上使用mmap?

来自分类Dev

如何保留R包的源文件,以便可以创建标签并跳转到vim中的定义

来自分类Dev

如何正确设置AppExecutionAlias以便可以从命令行启动程序?

来自分类Dev

如何从交替的布尔行创建新的Pandas DataFrame,以便可以绘制新的DataFrame?

来自分类Dev

如何为Shell脚本创建服务,以便可以像守护程序一样启动和停止它?

来自分类Dev

QML-如何创建QML组件属性,以便可以从JavaScript进行设置?

来自分类Dev

正确使用位图缓存

来自分类Dev

如何正确使用clip-rule =“ evenodd”,以便可以将一种形状切出另一种形状?

来自分类Dev

在php类中动态创建方法,以便可以访问$ this

来自分类Dev

如何在COBOL中正确声明小数,以便可以将它们用于算术计算?

来自分类Dev

动态调整组合框的宽度,以便可以显示整个字符串

来自分类Dev

如何正确安装名为“独立”的LaTeX软件包,以便可以使用Synaptic软件包管理器进行更新?

来自分类Dev

正确的方法来构建python可执行文件(在wxWidgets中),以便可以从另一个wxWidgets应用程序中调用它?

来自分类Dev

如何在Debian上正确配置exim4,以便可以使用`sendmail -t`通过我的office365帐户发送邮件?

来自分类Dev

如何创建ArrayList,以便可以记录每个项目的位置?

来自分类Dev

如何将私钥从远程服务器正确复制到我的本地计算机,以便可以使用ssh连接

来自分类Dev

如何创建矩阵,以便可以像$ array [$ key]这样访问数组中的每个数字

来自分类Dev

如何创建匿名类,以便可以将其传递给泛型构造函数?

来自分类Dev

PowerShell - 从文件名中解析开始字符,以便可以正确比较它们

来自分类Dev

正确键入 nextElementSibling 以便可以使用 .focus() 吗?

来自分类Dev

使 StackLayout 透明,以便可以看到后面的 WebView

Related 相关文章

  1. 1

    如何创建静态类的实例,以便可以从单独的类中调用它?

  2. 2

    如何从DefaultModelList创建列表,以便可以使用JAXB编组为XML?

  3. 3

    为TeamCity插件放置属性文件以便可以轻松编辑的正确位置是什么?

  4. 4

    如何在GLSL中正确声明统一的结构数组,以便可以将UBO指向它?

  5. 5

    如何创建密钥和机密,以便可以发布到存储桶?

  6. 6

    gradle如何选择某些URL查找存储库?如何将其指向正确的方向,以便可以导入此JAR?

  7. 7

    如何正确授权Azure用户帐户,以便它可以创建服务主体?

  8. 8

    Windows应用商店-RenderTargetBitmap创建大小不正确的位图

  9. 9

    如何正确地将C结构写入磁盘上的文件,以便可以在其上使用mmap?

  10. 10

    如何保留R包的源文件,以便可以创建标签并跳转到vim中的定义

  11. 11

    如何正确设置AppExecutionAlias以便可以从命令行启动程序?

  12. 12

    如何从交替的布尔行创建新的Pandas DataFrame,以便可以绘制新的DataFrame?

  13. 13

    如何为Shell脚本创建服务,以便可以像守护程序一样启动和停止它?

  14. 14

    QML-如何创建QML组件属性,以便可以从JavaScript进行设置?

  15. 15

    正确使用位图缓存

  16. 16

    如何正确使用clip-rule =“ evenodd”,以便可以将一种形状切出另一种形状?

  17. 17

    在php类中动态创建方法,以便可以访问$ this

  18. 18

    如何在COBOL中正确声明小数,以便可以将它们用于算术计算?

  19. 19

    动态调整组合框的宽度,以便可以显示整个字符串

  20. 20

    如何正确安装名为“独立”的LaTeX软件包,以便可以使用Synaptic软件包管理器进行更新?

  21. 21

    正确的方法来构建python可执行文件(在wxWidgets中),以便可以从另一个wxWidgets应用程序中调用它?

  22. 22

    如何在Debian上正确配置exim4,以便可以使用`sendmail -t`通过我的office365帐户发送邮件?

  23. 23

    如何创建ArrayList,以便可以记录每个项目的位置?

  24. 24

    如何将私钥从远程服务器正确复制到我的本地计算机,以便可以使用ssh连接

  25. 25

    如何创建矩阵,以便可以像$ array [$ key]这样访问数组中的每个数字

  26. 26

    如何创建匿名类,以便可以将其传递给泛型构造函数?

  27. 27

    PowerShell - 从文件名中解析开始字符,以便可以正确比较它们

  28. 28

    正确键入 nextElementSibling 以便可以使用 .focus() 吗?

  29. 29

    使 StackLayout 透明,以便可以看到后面的 WebView

热门标签

归档