GDI:使用 CreateCompatibleBitmap 或 CreateDIBSection 创建的位图是不是已初始化?

Posted

技术标签:

【中文标题】GDI:使用 CreateCompatibleBitmap 或 CreateDIBSection 创建的位图是不是已初始化?【英文标题】:GDI: Is a bitmap created with CreateCompatibleBitmap or CreateDIBSection initilized or not?GDI:使用 CreateCompatibleBitmap 或 CreateDIBSection 创建的位图是否已初始化? 【发布时间】:2020-11-28 09:09:22 【问题描述】:

我找不到任何关于CreateCompatibleBitmap()CreateDIBSection() 的文档来表明位图是否已初始化,如果已初始化,它会被初始化为什么?我会认为它确实是黑色的?我的假设正确吗?有记录吗?

TIA!!

【问题讨论】:

我会假设相同,但我没有任何文档,也没有明确测试过它。为了安全起见,只需执行 BitBlt(.., BLACKNESS) 以确保其为黑色(或白色为 WHITENESS)。 我认为这取决于GDI如何获得内存。如果它需要从系统中获取它,它将被清除,因此不会有信息从一个进程泄漏到另一个进程。如果可以从当前进程内存中满足请求,则可以获取随机内容。 @dan 这没有意义。 GDI 是在进程共享一个地址空间的时候发明的。而在 Windows NT 中,系统不会跟踪任何给定的 RAM 页是否以前被不同或相同的进程使用过。 【参考方案1】:

根据CreateCompatibleBitmap

备注

CreateCompatibleBitmap 函数创建的位图的颜色格式与 hdc 参数标识的设备的颜色格式相匹配。可以将该位图选择到与原始设备兼容的任何内存设备上下文中。

因为内存设备上下文允许彩色和单色位图,当指定的设备上下文是内存设备上下文时,CreateCompatibleBitmap 函数返回的位图格式会有所不同。但是,为非内存设备上下文创建的兼容位图始终具有与指定设备上下文相同的颜色格式并使用相同的调色板。

注意:创建内存设备上下文时,它最初会选择一个 1×1 单色位图。如果在 CreateCompatibleBitmap 中使用此内存设备上下文,则创建的位图是单色位图。要创建彩色位图,请使用用于创建内存设备上下文的 HDC

因此,如果您使用存储设备,则创建的位图是单色位图(黑白)。

更多参考:Memory Device Contexts和The result of CreateCompatibleDC only has two colors

因此您可以设置与该 DC 兼容的位图,以便获得更大的单色位图。

【讨论】:

您好,如果这个答案对您有帮助,请随时标记它以帮助遇到相同问题的人,如果您有任何问题,请告诉我。谢谢。

以上是关于GDI:使用 CreateCompatibleBitmap 或 CreateDIBSection 创建的位图是不是已初始化?的主要内容,如果未能解决你的问题,请参考以下文章

C#图形编程GDI+基础

C#_GDI+编程教程

如何使用准确的 GDI 字体大小?

使用GDI+生成KnownColor列表

GDI+ - 为啥 MeasureString 函数使用 Courier 字体失败?

从 OpenGL 切换到 GDI