GDI 渲染到 direct2D ID2D1BitmapRenderTarget 始终是透明的

2023-11-30

我想将我的电影渲染软件从 DirectDraw 移植到 Direct2D。由于兼容性问题,GDI 渲染需要在图像之上完成。为了优化性能我想实现某种后备缓冲机制,但是alpha通道信息似乎有问题,所有 GDI 绘图都显得透明.

我创建一个ID2D1Hwnd渲染目标对于我的窗把手和一个ID2D1位图将图像复制到。位图的像素格式是DXGI_FORMAT_B8G8R8A8_UNORM,阿尔法模式是D2D1_ALPHA_MODE_IGNORE。 HwdRenderTarget 与 GDI 兼容,因此我的渲染函数看起来像这样:

HwdRenderTarget.BeginDraw;
HwdRenderTarget.DrawBitMap(myBitMap);
HwdRenderTarget.GetDC(dc);

... do GDI drawing here ...

HwdRenderTarget.ReleaseDC();
HwdRenderTarget.EndDraw;

这个版本工作得很好:GDI 对象用纯色绘制,DrawTextEx-Text 具有透明背景。

为了优化性能,我想在“后备缓冲区”中进行 GDI 绘图,因此只有在发生变化时才需要执行此操作。 否则我只能渲染缓存的位图。位图是空的且透明的,因此只有绘制的对象应该是可见的。

我是否创建兼容的 RenderTargetID2D1位图渲染目标,阿尔法模式是D2D1_ALPHA_MODE_PREMULTIPLIED:

 HwdRenderTarget.CreateCompatibleRenderTarget(nil, nil, nil, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE, CompatibleRenderTarget);

现在我在 CompatibleRenderTarget 中进行 GDI 渲染:

CompatibleRenderTarget.BeginDraw;
if Supports(CompatibleRenderTarget, ID2D1GdiInteropRenderTarget, GdiInteropRenderTarget) then
begin
  GdiInteropRenderTarget.GetDC(D2D1_DC_INITIALIZE_MODE_CLEAR, dc);

  ... do GDI drawing here ...

  GdiInteropRenderTarget.ReleaseDC(fDstSize);
end;
GdiInteropRenderTarget := nil;
CompatibleRenderTarget.EndDraw;
CompatibleRenderTarget.GetBitmap(BackBuffer); // save the bitmap for drawing

我的渲染函数现在看起来像这样:

HwdRenderTarget.BeginDraw;
HwdRenderTarget.DrawBitMap(myBitMap);
HwdRenderTarget.DrawBitmap(BackBuffer);
HwdRenderTarget.EndDraw;

现在的问题是,所有 GDI 绘图在某种程度上都是透明的透明度取决于底层图像像素的值。深色文本在深色图像背景上显示为黑色,但在白色背景上变为白色。但是 GDI 中不使用 Alpha 通道,并且 myBitmap 也没有 Alpha 信息。

那么alpha信息从哪里来呢?有人有主意吗?提前致谢!

顺便说一句,在 CompatibleRenderTarget 上使用 Direct2D 绘图也可以正常工作。


我有同样的问题。以下内容对我有用(您需要使用 D2D1_ALPHA_MODE_IGNORE 而不是 D2D1_ALPHA_MODE_PREMULTIPLIED 创建渲染目标)。

ID2D1HwndRenderTarget* pRenderTarget; // render target created sometime earlier

D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(
    DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE);

ID2D1BitmapRenderTarget* pOffscreenRT = NULL;
pRenderTarget->CreateCompatibleRenderTarget(NULL, NULL, &pixelFormat,
    D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE, &pOffscreenRT);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDI 渲染到 direct2D ID2D1BitmapRenderTarget 始终是透明的 的相关文章

  • 在透明像素之上使用 DrawString 进行错误的文本渲染

    将文本渲染到位图时 我发现在具有非不透明 Alpha 的区域顶部渲染时 文本看起来非常糟糕 随着底层像素变得更加透明 问题变得越来越严重 如果我不得不猜测 我会说当底层像素是透明的时 文本渲染器将任何抗锯齿 灰色 像素绘制为纯黑色 以下是一
  • 使用 gdi+ 将 png 转换为 gif (C#)

    我有一个 png 文件 必须将其转换为 gif 文件 里面有一个透明的部分 当我保存它时 透明的部分是黑色的而不是透明的 这是我的代码 FileStream imgStream new FileStream outputFile FileM
  • C# Winforms 透明控件允许点击

    我有一个问题 与以下内容有点相关 C Winforms 透明控件允许点击 https stackoverflow com questions 855826 c winforms transparent control allowing cl
  • GDI+闪烁

    所以我正在尝试制作一个廉价的 Gyazo 屏幕截图工具 副本 问题是光标坐标闪烁 我该如何防止呢 我已经尝试过了WM ERASEBKGND但这没有任何帮助 另外我的代码还有什么问题吗 有什么不好的做法 技术吗 include
  • 如何在 JLayeredPane 上设置背景颜色?

    我很好奇为什么在 JLayeredPane 上调用 setBackground Color 似乎并没有真正设置背景颜色 我猜这与 JLayeredPane 由于某种原因必须具有透明背景有关 不管怎样 这里有一些代码显示了这个问题 这是在 M
  • 使 GDI 绘图不可点击

    我有一个带有 GDI 绘图的透明 WinForms 应用程序 我将其用作覆盖层 问题是 每当我单击 GDI 绘图时 焦点就会转到应用程序窗口 我该如何扭转这种情况 您需要使用right颜色如TransparencyKey 一切使得Form
  • Windows 字体安装后无法立即在应用程序中使用?

    每当我在 Windows 2003 服务器上安装新字体时 我都无法立即在我的 asp net Web 应用程序中使用它 应用程序通过以下方式获取字体CreateFontIndirectgdi32 dll win api 然后使用此字体在我的
  • 如何重叠两个控件

    我有一个圆和一个线控件 Circle 控件的 OnPaint 绘制一个圆 Line 控件的 OnPaint 绘制一条线 这两个控件包含在另一个控件 DrawingControl 中 我需要在圆上放置一条线 但圆的背景删除了该线 我尝试启用透
  • 是否有适用于 IE6 的 JavaScript PNG 修复程序允许 CSS 背景定位?

    我已经看到了一些允许 PNG 图像在 Internet Explorer 6 中具有透明度的修复 但我还没有找到一个也允许您在 CSS 中设置背景位置的修复 如果你使用精灵 那就会破坏交易 我求助于使用 GIF 质量不高 根本不使用透明图像
  • C# - Windows 窗体应用程序位图 SetPixel 和 GetPixel 的更快替代方案

    我正在尝试自学 C 并且从各种来源听说函数 get 和 setpixel 可能非常慢 有哪些替代方案 性能改进真的那么显着吗 我的一段代码供参考 public static Bitmap Paint Bitmap b Color f Bit
  • WPF 上下文菜单设计。如何在WPF菜单项中设置背景?

    我创建这样的弹出菜单
  • bitblt 在 Windows 10 版本 1703 上失败 (15063.138)

    使用 Visual Studio 2017 vc141 以下代码应该从前游戏窗口获取屏幕截图 但现在它返回黑色和空白图像 唯一的游戏问题 尝试过 OpenGL 和 Vulkan ogl 返回黑色 vulkan 返回白色 在升级到 Windo
  • 使用 GdiPlus 卸载 DLL 时程序挂起

    我有一个加载 DLL 的应用程序 它使用德尔福 GDI 库 http sourceforge net projects delphigdiplus 该应用程序在卸载 DLL 时挂起 调用免费图书馆 https msdn microsoft
  • Android 导航视图透明度

    每个人 是否有可能使Navigation View透明的 我有自定义布局并尝试为此布局设置 50 透明背景 Navigation View or Drawer Layout android background 80000000 但它没有给
  • 通过 SharpDX 渲染 Direct2D 图像时如何使用内存流而不是文件?

    设置 考虑使用给定的临时程序SharpDX http code google com p sharpdx Direct 库的托管包装器 用于渲染位图并将其保存为 PNG namespace ConsoleApplication5 using
  • 使用 ImageMagick 和 PHP 将 PNG 转换为 JPG 并将透明背景设置为白色

    将图像从 PNG 转换为 JPEG 时 如何使用 ImageMagick 带有 php 扩展 将透明背景设置为白色 在撰写本文时 您尚未指定正在使用哪个扩展 但如果您使用命令行 则命令将是 convert image png backgro
  • 使用 Visual C++ 在桌面上绘图

    我正在编写一个 opencv 应用程序 使用 Visual Studio VC 控制台应用程序使用激光束进行绘图 我想在桌面上画线 我知道绘图功能在 GDI32 dll 中可用 但对如何将 GDI32 dll 与我的 vc 代码集成感到困惑
  • 如何在pygame中制作圆形曲面

    我需要创建一个具有边界圆的曲面 在该表面上绘制的任何内容在该边界圆之外都不应该是可见的 我尝试过使用蒙版 次表面 srcalpha 等 但似乎没有任何效果 我的尝试 w ss get width h ss get height TRANSP
  • 关于 ColorMatrix 转换如何工作的说明

    我正在图像处理应用程序上做一些工作 为了好玩 并且正在努力完全理解 ColorMatrix 转换的工作原理 我了解了线性 仿射变换的基础知识 并且可以通过在线复制示例来很好地理解 但我想完全掌握why有些东西有效 而不是仅仅满足于它有效 例
  • 将透明PNG图像转换为透明JPEG或透明GIF [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个透明的 PNG 图像 我想将其添加为水印this http www bsrsoft com 视频录制软件 但问题是 软件需要jpeg图像作为水

随机推荐

  • Spring Cloud Config - 多个复合存储库?

    是否可以使用多个复合存储库配置 Spring Cloud Config 我们的设置使用多个基于团队的存储库 spring cloud config server git repos teamA cloneOnStart true patte
  • 将外部json文件读入RDD并提取scala中的特定值

    首先 我对 scala 和 Spark 完全陌生 尽管对 pyspark 有点熟悉 我正在使用外部 json 文件 该文件非常大 并且不允许我将其转换为数据集或数据帧 我必须对纯 RDD 执行操作 所以我想知道如何获得键的具体值 所以我将
  • 如何用sql语句计算树的深度?

    我不太明白递归查询是如何工作的以及如何解决这个问题 我们得到了左边的表 结构看起来像右边的树 ID Parent 1 1 null 2 1 2 3 3 1 4 3 4 5 4 6 4 5 6 7 6
  • 在类名中使用点 (.) 设置元素的样式

    嘿 我有一个这样的元素 span class a b 不幸的是 这个类名来自电子商务应用程序 无法更改 我可以设计一个带有点的类名吗 like a b a b 然而 可能有一些浏览器不支持这一点 span
  • 检测 Android 应用程序何时进入后台

    在我的应用程序中 我需要检测我的应用程序是要进入后台还是要切换到同一应用程序的另一个活动 我知道我必须使用 onPause 方法 但是我如何区分这两种情况 private static boolean isApplicationGoingT
  • 将值附加到列表中的每个子列表

    我有一个列表列表 我想将一个常量值附加到完整列表的每个子列表 例如 lst 1 2 3 4 5 6 我想附加7到每个子列表 以便 lst变成 1 2 7 3 4 7 5 6 7 有没有好的方法来完成工作 例如使用zip 谢谢 for l i
  • 从 SQL Server 到外部应用程序的消息 (activemq)

    我的系统中安装了 SQL Server 数据库和 Activemq 我尝试创建端点来监听 activemq 所在的端口 端口是61617 CREATE ENDPOINT InstInitiatorEndpoint STATE STARTED
  • Android 清单使用权限与 Android 设备规格

    有什么方法可以检查原因吗我的安卓应用程序不显示在Play Store在某些设备上 例如Samsung Galaxy S Duos Samsung Ace Plus and Micromax A110ETC 虽然我可以通过安装我的应用程序US
  • 使用 Directory.Getfiles 并指定绝对路径

    嗨 我想知道你们是否可以帮忙 我正在编写一个应用程序 该应用程序将运行在多个服务器上 因此有多个 IP 我不想使用确切的 IP 和目录结构 而是想从应用程序实际运行的位置 后退 一个文件夹 那么例如 文件夹结构是 controls 这包含
  • 字符串到字符串的压缩算法?

    我正在寻找一种算法 可以将一些字符串压缩为另一个字符串 即没有 0 或特殊控制字符 但我在互联网上找不到任何内容 有这样的算法吗 它不必特别高效 只需一些基本的东西即可 Easy echo Hello world gzip c base64
  • 使用 COUNT(DISTINCT ...) 时出现 BigQuery 错误“响应太大而无法返回”

    我有一个大约 20M 行的数据集 我正在观察以下行为 下面的查询返回错误 响应太大而无法返回 id 字段在多个记录之间共享 field 字段对于每个记录都有一些任意值 我预计结果集应该只包含 10 行 远低于查询响应限制 SELECT id
  • 在具有相似名称的多个数据帧上使用 rbind() 的优雅方法?

    目前 我有多个同名且按运行顺序排列的数据帧 foo1 foo2 foo3 foo4 foo5 ETC 我正在尝试创建一个包含上述数据帧的所有行的大型数据帧rbind 有没有一种优雅的方法来做到这一点 这相当于rbind foo1 foo2
  • 如何在Python中获取文件中的字节偏移量

    我正在使用 hadoop 和 python 制作倒排索引 我想知道如何在 python 中包含行 字的字节偏移量 我需要这样的东西 hello hello txt 1124 我需要制作完整倒排索引的位置 请帮忙 像这样 file tell
  • 动态加载 less.js 规则

    我正在考虑使用less js 看起来很棒 但我们的网站要求在初始页面加载后动态加载某些样式 然而 似乎所有 LESS 样式表都必须在 less js 脚本加载之前加载 即这有效 但如果交换行就会失败 Firefox 和 chrome 似乎都
  • 如何使用python计算地球表面多边形的面积?

    标题基本上说明了一切 我需要使用 Python 计算地球表面多边形内的面积 计算地球表面任意多边形包围的面积对此说了一些话 但对技术细节仍然含糊其辞 如果你想用更多的方法来做到这一点 GIS 风味 那么你需要选择 您所在地区的计量单位以及
  • Azure 自定义脚本扩展。以另一个用户身份执行脚本

    我使用 command1 ps1 脚本在目标 VM 上安装 Azure 自定义脚本扩展并执行 command2 ps1 command2 ps1 应该以域管理员身份运行脚本 位于 ScriptBlock 内 因此 Credential Cr
  • 禁用特定月份 JqueryUI datepicker

    我正在创建一个包含 jQuery UI Datepicker 的预订表单 现在我有一个需要帮助的主要问题 有些旅行只有特定日期有效 并且只能在特定月份出售 因为例如旋风季节 禁用特定工作日的功能非常完美 但我不确定如何停用完整的月份 例如十
  • 为什么“git分支”在新存储库中保持沉默?

    当您创建新存储库并运行git branch 它默默地退出 例如 mkdir tmp foo cd tmp foo git init Initialized empty Git repository in tmp foo git git br
  • 对可能不包含协议的字符串运行 parse_url()

    我正在尝试从用户输入的 URL 字符串中获取域名和 TLD 无子域 该字符串可能有也可能没有协议 目录 子域 文件名等 换句话说 考虑到以下任一情况 example com www example com sub example com e
  • GDI 渲染到 direct2D ID2D1BitmapRenderTarget 始终是透明的

    我想将我的电影渲染软件从 DirectDraw 移植到 Direct2D 由于兼容性问题 GDI 渲染需要在图像之上完成 为了优化性能我想实现某种后备缓冲机制 但是alpha通道信息似乎有问题 所有 GDI 绘图都显得透明 我创建一个ID2