是否可以直接从 GDI+ 位图进行 BitBlt?

2023-11-24

是否可以使用 BitBlt 直接从 GDI+ 位图中复制而不使用 GetHBitmap?

GetHBitmap 很慢,因为它除了 BitBlt 副本之外还创建整个图像的新副本,并且比 BitBlt 副本慢,并且必须处理给定的 HBITMAP。图像很大。

有没有办法让BitBlt使用原始GDI+图像的像素数据?

EDIT:我可以获得指向 GDI+ 位图像素数据在内存中位置的指针。我可以创建一个指向 GDI+ 位图像素数据的 HBITMAP 以避免额外的复制,并从中创建 BitBlt 吗?


经过几天的寻找,我突然意识到答案一直就在我面前!我正在从指向字节数组的指针创建 GDI+ 位图。然后尝试使用相同的指针创建 HBITMAP。但我可以先轻松创建 HBITMAP,然后使用其中的指针来创建 GDI+ 位图。

它就像一个魅力!您可以随意混合 GDI 和 GDI+ 操作。该图像同时是普通 GDI 和 GDI+。您可以从完全相同的像素数据中进行 BitBlt,而不是使用 DrawImage!

这是代码:

// Create the HBITMAP
BITMAPINFO binfo = new BITMAPINFO();
binfo.biSize = (uint)Marshal.SizeOf(typeof(BITMAPINFO));
binfo.biWidth = width;
binfo.biHeight = height;
binfo.biBitCount = (ushort)Image.GetPixelFormatSize(pixelFormat);
binfo.biPlanes = 1;
binfo.biCompression = 0;

hDC = CreateCompatibleDC(IntPtr.Zero);

IntPtr pointer;
hBitmap = CreateDIBSection(hDC, ref binfo, 0, out pointer, IntPtr.Zero, 0);

// Create the GDI+ bitmap using the pointer returned from CreateDIBSection
gdiBitmap = new Bitmap(width, height, width * binfo.biBitCount >> 3, pixelFormat, pointer);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以直接从 GDI+ 位图进行 BitBlt? 的相关文章

  • Win32 API:如何读取序列号,或者如果不是数据则在超时内退出

    我需要一个函数来从串行端口读取数据 或者如果在时间间隔内没有数据则返回 例如 在 GNU Linux 上你可以使用poll orselect read Windows 中有类似的东西吗 下面是我尝试过的 它应该可以工作 但是功能获取重叠结果
  • 使用 GDI+ 使用不同颜色绘制线条的快速方法?

    我有一个动态的点列表 可以随时添加新点 我想用不同的颜色画线来连接它们 颜色基于这些点的索引 这是代码 private List
  • Image.Save() 对 jpeg 文件使用什么质量级别?

    当我加载一个 jpg 文件并转身并以 100 的质量保存它时 我感到非常惊讶 而且大小几乎是原始文件的 4 倍 为了进一步调查 我在没有明确设置质量的情况下打开并保存 文件大小完全相同 我认为这是因为没有任何改变 所以它只是将完全相同的位写
  • WINAPI/DWMAPI 不规则形状的模糊窗口

    注意 这不是关于无边框窗口的问题 因此 前几天我在 Windows 7 上浏览 开始 菜单时偶然发现了这个程序 它是一个本机 Windows 程序 称为 数学输入面板 现在 我对窗户的形状很好奇 我知道它并不是完全由 DWM 绘制的 因为边
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 资源文件是否编译为 UNICODE 或 ANSI 代码页?

    首先 如果这个问题已经被回答了一百次了 我深表歉意 噢 但我的搜索显然很糟糕 因为我没有运气回答这个基本问题 EXE DLL中的资源是如何存储的 作为 UNICODE UCS 2 Windows 本机内部字符格式 还是使用资源块的代码页作为
  • 调整大小时在窗口中绘图留下未绘制的边框

    我遇到的问题看似微不足道 但我找不到解决的方法 这里是 我有一个窗口 里面有一些图形 为了简单起见 我们假设它是一个实心绿色矩形 填充了窗口的整个客户区域 我希望每次窗口改变大小时都重新绘制这个矩形并填充整个窗口 我最初做的就是这样的 我已
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 以编程方式更改任务栏图标(Win32,C++)[重复]

    这个问题在这里已经有答案了 我有一个 C win32 程序 我想在运行时编辑任务栏图标以显示有关该程序的警报等 但是我对 win32 api 不太有经验 而且我找不到任何东西在线的 我发现的最接近的是http www windows tec
  • 提取证书中主题属性的所有值

    我目前正在使用CertGetNameString http msdn microsoft com en us library windows desktop aa376086 28v vs 85 29 aspx提取每个主题属性的值 如下所示
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • OleLoadPicturePath 是否已以非向后兼容的方式更改?

    我最近遇到一个问题 我能够在一台 PC 上将图标添加到 VB6 表单 它运行良好 但他们无法在第二台 PC 上运行 编译它 结果发现图标文件是 32 位的 包括 Alpha 通道 这就是问题所在 但令我惊讶的是 这是一个依赖于系统的功能 在
  • C++/Win32 在虚拟内存中创建文件

    如何在虚拟内存中创建文件以及可以在其上使用普通文件函数 如 CreateFile WriteFile 等 吗 我正在尝试实现一个缓冲文件编写器类 但问题是管理需要动态常量重新分配的缓冲区 你可以使用管道 它们也被操作系统视为 文件 您可以将
  • P/invoke 函数采用指向结构的指针[重复]

    这个问题在这里已经有答案了 功能如创建进程 http msdn microsoft com en us library ms682425 VS 85 aspx有带有指向结构的指针的签名 在C中我会通过NULL作为可选参数的指针 而不是在堆栈
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • GDI 函数 BitBlt 和 StretchBlt 在 Win32 中是否硬件加速?

    我似乎无法通过搜索得到明确的答案 Win32 blitting 操作是否硬件加速 GDI 而不是 GDI 我不知道这些函数如何与图形驱动程序交互 是否有任何函数调用来验证此功能 例如 GetCaps 对于特定的图形设备 win32图形设备
  • GetKeyState 函数?

    为什么我按下方向箭头ON后 函数GetKeyState仍然给我一个大于0的值 include
  • Java - 使用 JNA 的 Windows 任务栏 - 如何将窗口图标 (HICON) 转换为 java 图像?

    我正在尝试将应用程序切换器添加到我正在处理的更大项目中 它需要在 Windows XP Vista 7 8 上运行 我正在使用 Java 1 7 下面是我创建的一个示例应用程序 用于演示我遇到的一些问题 我对 JNA 很陌生 非常感谢 充满
  • GDI+、JPEG 图像到 MemoryStream 中发生一般错误

    这似乎是整个网络上一个臭名昭著的错误 以至于我无法找到问题的答案 因为我的场景不适合 当我将图像保存到流中时 会引发异常 奇怪的是 这对于 png 来说效果很好 但是对于 jpg 和 gif 却给出了上述错误 这是相当令人困惑的 大多数类似
  • 如何在 C++ 中使用 LoadLibrary(..) 调用 kernel32.dll 函数 GetTickCount()

    我正在寻找一个在 Windows 机器上获取以毫秒为单位的时间的函数 本质上 我想调用这个 WinAPI 函数 GetTickCount 但我陷入了 使 用 LoadLibrary n 调用 GetTickCount 函数 部分 我搜索了每

随机推荐

  • 使用 tf.trainable_variables() 显示可训练变量的名称

    我正在处理weights in a RNNCell 我有以下代码 var names for var in tf trainable variables var names append var name 在另一个名为model py 我正
  • 正则表达式验证密码强度

    我的密码强度标准如下 8个字符长度 2 个大写字母 1 个特殊字符 2 个数字 0 9 3 个小写字母 有人可以给我同样的正则表达式吗 密码必须满足所有条件 您可以使用积极的前瞻断言来执行这些检查 A Z A Z 0 9 0 9 a z a
  • 我如何在discord.py中创建一个有效的斜杠命令

    我正在尝试使用 discord py 创建斜杠命令 我已经尝试了很多东西 但它似乎不起作用 如有帮助 将不胜感激 注意 我将在最后包含 pycord 的版本 因为我认为它更简单 也是最初的答案 不和谐 py版本 首先确保您安装了最新版本的d
  • Algolia 搜索网络错误

    我正在将 Algolia 与我拥有的 Firebase 项目连接起来 我使用 Firebase Cloud Functions 来使 Algolia 索引与 Firebase 数据库中发生的所有更改保持同步 但每当我打电话 索引 saveO
  • 为什么 CMP(比较)有时会在 8086 汇编中设置进位标志?

    我一直在阅读 8086 指令集 它说 CMP 比较 可以设置进位标志 我知道比较会减去两个操作数 但我想知道在这种情况下是否有人可以提供一个示例 我只是无法理解添加数字和负数将设置进位标志的想法 我已经阅读了借用标志 但我只需要一个示例来阐
  • Bootstrap:移动显示上的列之间的间隙

    我正在使用 bootstrap 3 0 制作一个网站 我希望 HTML 和 CSS 能够在桌面 平板电脑和移动设备上清晰地看到 我遇到的一个问题是 当您在移动显示器上查看该网站时 该列会堆叠在一起 我并不是在批评它 因为它会尽可能地停止滚动
  • 白名单不适用于人行横道离子

    我使用 ionic 创建了一个工作应用程序 从我的网站获取数据没有问题 一切都很好 然后我去添加人行横道 现在当我在 Android 手机上运行它时出现错误 W XWalkCordovaResourceClient URL blocked
  • 无法从传输连接读取数据:控制台应用程序中的连接已关闭错误

    我在控制台应用程序中有这段代码 它在循环中运行 try HttpWebRequest request HttpWebRequest WebRequest Create search request Headers Add Accept La
  • 使用 TextFieldParser 处理包含未转义双引号的字段

    我正在尝试使用导入 CSV 文件文本字段解析器 一个特定的 CSV 文件由于其非标准格式而给我带来了问题 相关 CSV 的字段用双引号括起来 当特定字段中有一组附加的未转义双引号时 就会出现此问题 这是一个过于简单的测试用例 突出了这个问题
  • 谷歌地图 api v3 - 从外部点击打开信息窗口

    所以我有一个 V3 地图 其初始化如下 function init var mapCenter new google maps LatLng 51 5081289 0 128005 var map new google maps Map d
  • React 导航抽屉的状态? (打开或关闭)

    我正在使用 React Navigation 构建一个抽屉 并且希望在用户关闭抽屉时执行一些逻辑 我在文档中没有看到任何明显的内容可以让我做到这一点 有人知道有办法做到这一点吗 您需要自定义导航操作来捕获DrawerClose event
  • Java 将 GMT/UTC 转换为本地时间无法按预期工作

    为了展示可重现的场景 我正在执行以下操作 获取当前系统时间 当地时间 将当地时间转换为 UTC 在此之前工作正常 反转 UTC 时间 回到当地时间 遵循 3 种不同的方法 如下所列 但所有 3 种方法均仅保留 UTC 时间 long ts
  • python子进程模块:循环子进程的标准输出

    我有一些使用子进程模块运行的命令 然后我想循环输出的行 文档说不要做 data stream stdout read 我不是 但我可能正在做一些调用它的事情 我像这样循环输出 for line in data stream stdout d
  • 如何从决策树中提取规则spark MLlib

    我正在使用 Spark MLlib 1 4 1 创建决策树模型 现在我想从决策树中提取规则 如何提取规则 您可以通过调用 model toDebugString 以字符串形式获取完整模型 或通过调用 model save sc filePa
  • IE 11 浏览器将自身识别为 Mozilla [重复]

    这个问题在这里已经有答案了 我正在开发 MVC 应用程序 net 4 5 框架 VS 2010 我有一段 Javascript 代码 可以识别应用程序正在运行的浏览器 如果浏览器是 Firefox 则将执行特定的代码块 否则将执行另一个代码
  • 与名为 com.apple.nsurlstorage-cache 的服务的连接已失效

    我正在为 iOS8 创建自定义键盘 但我很难解决 NSURLConnection 的一些问题 我正在使用 sendAsynchronousRequest 方法 如下所示 NSURLConnection sendAsynchronousReq
  • 在 PHP 中从数组键创建新变量

    假设我有一个数组 如下所示 foo array first gt 1st second gt 2nd third gt 3rd 如何从数组中挑选键并使它们成为自己的变量 例如 数组 foo会成为 first 1st second 2nd t
  • iPhone 中从右到左的 UI(希伯来语)

    我正在努力在 iPhone 应用程序中创建 RTL UI 该框架似乎不支持 RTL 语言 唯一的事情是标签内的对齐 这很好 但它与其他控件的行为冲突 问题是 RTL TableView 有工作代码吗 有什么东西可以将公开按钮置于左侧 章节标
  • 如何为 Maven 创建新的打包类型?

    我需要使用 Maven 创建 jar 文件 但它们需要以 foobar 扩展名安装到存储库中 如果它们可以有自己的打包类型 这样我们就可以通过打包来识别这些工件 那就太好了 我可以设置新的包装类型来执行此操作吗 要按照您的描述进行操作 请创
  • 是否可以直接从 GDI+ 位图进行 BitBlt?

    是否可以使用 BitBlt 直接从 GDI 位图中复制而不使用 GetHBitmap GetHBitmap 很慢 因为它除了 BitBlt 副本之外还创建整个图像的新副本 并且比 BitBlt 副本慢 并且必须处理给定的 HBITMAP 图