如何为 32 位位图生成单色位掩码

2023-11-21

在 Win32 下,通过执行以下操作从位图生成单色位掩码以供透明度使用是一种常见技术:

SetBkColor(hdcSource, clrTransparency);
VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY));

假设 hdcSource 是保存源图像的内存 DC,hdcMask 是保存相同大小的单色位图的内存 DC(因此两者都是 32x32,但源是 4 位颜色,而目标是 1 位单色)。

然而,当源是 32 位颜色 + alpha 时,这对我来说似乎失败了。我没有在 hdcMask 中获得单色位图,而是获得全黑的蒙版。没有位设置为白色 (1)。而这适用于 4 位颜色源。

我的 search-foo 失败了,因为我似乎找不到任何对此特定问题的引用。

我发现这确实是我的代码中的问题:即,如果我使用 16 色(4 位)的源位图,它就可以工作;如果我使用 32 位图像,它会生成全黑蒙版。

对于 32 位彩色图像,我应该使用其他方法吗? Alpha 通道是否存在覆盖上述技术正常行为的问题?

感谢您提供的任何帮助!

附录:我仍然无法找到一种技术来为我的 GDI+ 生成的源位图创建有效的单色位图。

我通过根本不生成单色位掩码在一定程度上缓解了我的特殊问题,而是使用TransparentBlt(),这似乎是正确的(但我不知道他们在内部做了什么,这与允许他们正确地掩盖图像)。

拥有一个非常好的、有效的函数可能会很有用:

HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);

无论 hSource 的颜色深度如何,它始终创建有效的透明度蒙版。


如果有 Alpha 通道则无法做到这一点。 COLORREF 将前 8 位用于多种目的,包括指定较低的 3 个字节是否是当前调色板的颜色表索引或 RGB 三元组。因此,您不能在 clrTransparency 的高字节中指定除 0x00 之外的任何内容。

如果您有一个 Alpha 位图,那么对于仍然“不知道”Alpha 通道的 GDI,没有明智的方法来实际比较 24 位 BkColor 与位图中的 32 位像素。

我希望 GDI 将 32bpp 位图中的 Alpha 通道视为“保留”,并且仅成功比较保留通道为零的像素。也就是说,无论如何,您的蒙版颜色必须完全透明才有机会成功。 (并且,如果您制作了合法的预乘位图,这意味着 RGV 值也将为零,而不是限制您对遮罩颜色的选择:P)

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

如何为 32 位位图生成单色位掩码 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • android挂起意图通知问题

    我的应用程序中有一个警报 它会启动一个通知 然后在按下时启动一个活动 问题是 当我创建多个警报时 从通知启动的活动将获得与第一个警报相同的额外内容 我认为问题要么在于我放入待决意图中的意图 要么在于待决意图本身 我想我可能需要在其中一个上挂
  • 如何在 OS X Yosemite 上的 Apache 2.4 中安装 mod_perl 2.0.9?

    随着 OS X 10 10 Yosemite 的发布 Apple 将其 Apache 服务器升级到了 2 4 版本 发布时 mod perl 2 0 8 与 Apache 2 4 不兼容 mod perl 2 0 9 尚未正式发布 更多信息
  • 模拟本地主机上的慢速互联网连接

    我使用 c asp net 和 iis 我想在我的电脑上模拟慢速互联网连接来测试我的应用程序 我可以控制iis的带宽吗 请不要建议 System Threading Thread Sleep someDuration 在 c 文件中 您可以
  • Android 图像捕捉时内存不足

    我有一个拍摄照片的活动 具有全部可能的分辨率 因此相当大 应用程序有机会分析它们 一次仅处理一张照片 问题是我在拍了 4 5 张照片后遇到了 内存不足 的情况 我懂了 dalvikvm heap 5070745 字节分配内存不足 字节大小不
  • 如何使用 Float(在打印样式表中)修复此打印布局?

    我有一个页面 其中包含网格格式的多个图表 如下所示 每个图表都显示在一个包装中float left图表所在的 div 有overflow auto 这给出了将图表包裹到屏幕宽度的所需布局 我遇到的问题是 在打印模式下 这只打印一页并丢失其余
  • TableView 就像 iPhone 中的通讯录应用程序

    嘿 我正在开发一个联系人应用程序 我想要具有相同类型的 Tableview 和添加按钮 因此 当用户添加新联系人时 它将打开一个新视图 其中包含标准按钮和文本字段等 如何使应用程序向每个新视图添加相同的功能 我希望这是有道理的 先感谢您 这
  • 包括 javascript 到 google 网站

    我试图在 Google 协作平台中包含一个简单的 javascript 但按下按钮时我什么也没得到 我将代码放入 HTML 框中 该代码在本地测试时完美运行 这是我的代码
  • 如何使用 ArrayList 正确实现 Parcelable?

    我在上课时遇到困难Parcelable 问题是 我正在尝试向包裹中的一个成员写信 该成员是ArrayList
  • 与R语言匹配以获得位置

    我使用 match 来获取元素是否在列表中 例如我的清单是 c a b h e and so on 如果我想查看元素 h 是否在列表中 我可以这样使用 match if h in v do something 如何获取列表中找到元素的位置
  • Firestore 安全规则:仅当新文档 ID 与用户 ID 相同时才允许用户创建文档

    当用户第一次登录时 我还需要调用一个函数 在我的 firestore 用户集合中创建一个文档来存储他们的个人资料数据 使用Web SDK 我之前使用带有 firebase 函数的新用户触发事件 但等待冷函数启动的速度太慢 安全规则要求 需要
  • Haskell:模块导入带来不必要的二进制增长

    当我通过以下方式之一将 大 模块导入主模块时 import Mymodule import qualified Mymodule as M import Mymodule MyDatatype 与我不导入该模块时相比 编译后的二进制文件增长
  • 如何限制android中edittext的输入时间

    我必须允许用户在动态编辑文本中仅输入 格式的时间 有什么方法可以实现吗 我使用了下面的代码 但它不起作用 我可以输入超过 24 个值的数字 例如 45623 5689 edit setInputType InputType TYPE DAT
  • 如何使用 Edge 浏览器在 VSCode 中调试 Angular 应用程序?

    我在用边缘延伸 下面是配置launch json configurations name ng serve type edge request launch url http localhost 4200 webRoot workspace
  • 自定义图例/图像作为传单地图中的图例

    我用自定义图标作为标记构建了一个地图 您可以在我的 jsfiddle 中查看代码和结果 https jsfiddle net marielouisejournocode x24stb0m 我尝试更改 正常 图例代码以将图片放在那里 但我对
  • 由于(据称)未跟踪的文件而导致文件覆盖的 Git 警告

    尝试从 git repo 中拉取 但得到以下输出 我认为这些文件被跟踪 它们应该被跟踪 但它表明它们没有被跟踪 它们不在 gitignore 中 我在分支后面进行了大约 5 10 次提交 git pull rebase origin mas
  • 观察 Vuejs 中 window.scrollY 的变化

    我有一个非常简单的应用程序 有 2 个组件 App vue和另一个组件 Home vue我在其中保存应用程序的其余结构 粘性标题和一些带有可滚动到的锚点的部分 我想对粘性标题应用一个类 以在页面滚动时最小化徽标 所以我想我会留意任何变化wi
  • 按值传递(StringBuilder 与 String)[重复]

    这个问题在这里已经有答案了 我不懂为什么System out println 名称 输出Sam不受方法的 concat 函数的影响 而System out println 名称 输出Sam4作为该方法的追加方法的结果 为什么 StringB
  • 使用新模型和防护的 Laravel 身份验证失败:未定义索引:模型

    我正在尝试使用额外的模型和防护来验证我的 Laravel 应用程序 5 8 问题是 我在以下登录方法中收到 未定义索引 模型 错误 有什么想法我做错了吗 我已经在 Laravel 5 7 版本中使用了这个集成 并且它在那里工作没有任何问题
  • 使用 Firebase FCM 时为什么无法折叠推送通知?

    const options priority high collapseKey user id const deviceTokensPromise db ref users fcm tokens user id once value dev
  • 如何为 32 位位图生成单色位掩码

    在 Win32 下 通过执行以下操作从位图生成单色位掩码以供透明度使用是一种常见技术 SetBkColor hdcSource clrTransparency VERIFY BitBlt hdcMask 0 0 bm bmWidth bm