从加载到内存的 24 位 BMP 文件中获取 HBITMAP

2024-03-31

我有一个 24 位 BMP 文件加载到 RAM 中,我正在尝试为此图像文件创建一个 HBITMAP。我发现了一些我一直在尝试的例子,但似乎无法发挥作用。基本上,我需要该文件的 HBITMAP,以便我可以卸载该文件并保留 HBITMAP,稍后可以使用 DeleteObject() 对其进行处理。由于此位图很早就加载到我的应用程序中,因此没有应用程序窗口,因此没有 HDC。这是我到目前为止所拥有的:-

HBITMAP cBitmap;  // This should be where my bitmap handle ends up.
mem;              // This is a void* pointer to the loaded BMP file


tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)mem;
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(mem + sizeof(tagBITMAPFILEHEADER));
RGBQUAD rgb = *(RGBQUAD*)(mem + sizeof(tagBITMAPFILEHEADER) + sizeof(tagBITMAPINFOHEADER));

BITMAPINFO bi;
bi.bmiColors[0] = rgb;
bi.bmiHeader = bih;

UINT8* pixels = mem + bfh.bfOffBits;
void* ppv;
HBITMAP hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, &ppv, NULL, 0);
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pixels, &bi, DIB_RGB_COLORS);
GetObject(hBitmap, sizeof(BITMAP), &cBitmap);

由于某种让我困惑的原因,cBitmap 最终变成了 NULL。还有一件让我困惑的事情...... DIB_RGB_COLORS 意味着 BITMAPINFO 有一个指向文字 RGB 值的指针,但是它如何与没有调色板的 24 位图像一起工作?


如果您从磁盘加载文件,它可能是最容易使用的LoadImage()LR_LOADFROMFILE flag.

创建一个HBITMAP从已经加载到内存中的文件数据中,您可以执行类似于以下操作:

HBITMAP ConvertDibToHBitmap(void* bmpData)
{
    HBITMAP hBitmap = NULL;
    BOOL success = FALSE;

    // NOTE: Assumes the BITMAPFILEHEADER is present (not normally the case for
    // an in-memory DIB)
    LPBITMAPFILEHEADER bfh = (LPBITMAPFILEHEADER) bmpData;
    LPBITMAPINFOHEADER bih = (LPBITMAPINFOHEADER) (bfh + 1);
    void *pixels = (char*) (bih + 1); // NOTE: Assumes no color table (i.e., bpp >= 24)

    HDC hdc = GetDC(NULL);
    if (hdc != NULL) {
        hBitmap = CreateCompatibleBitmap(hdc, bih->biWidth, bih->biHeight);
        if (hBitmap != NULL) {
            HDC hdcMem = CreateCompatibleDC(hdc);
            if (hdcMem != NULL) {
                HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);
                if (StretchDIBits(hdcMem, 0, 0, bih->biWidth, bih->biHeight,
                        0, 0, bih->biWidth, bih->biHeight, pixels,
                        (LPBITMAPINFO) bih, DIB_RGB_COLORS, SRCCOPY) > 0)
                    success = TRUE;

                SelectObject(hdcMem, hOldBitmap);
                DeleteDC(hdcMem);
            }
        }

        ReleaseDC(NULL, hdc);
    }

    if (!success && hBitmap != NULL) {
        DeleteObject(hBitmap);
        hBitmap = NULL;
    }

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

从加载到内存的 24 位 BMP 文件中获取 HBITMAP 的相关文章

  • winapi 函数的函数指针 (stdcall/cdecl)

    请有人给我一些为 MS winapi 函数创建函数指针的提示吗 我试图为 DefWindowProc DefWindowProcA DefWindowProcW 创建一个指针 但出现此错误 LRESULT dwp HWND UINT WPA
  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • 预注册 ATL 窗口类

    我在一个项目中使用了 ATL 和 WTL 的组合 并从中派生了我自己的类CWindowImpl 看起来像这样 class CMyControl public CWindowImpl
  • 链接到大地址感知 DLL

    假设我有一个使用 LARGEADDRESSAWARE 链接器标志集构建的 DLL 现在我有一个动态链接到该 DLL 的应用程序 这是否会使我的应用程序具有大型地址意识 如果不是 那么为任何 DLL 设置此标志是否有意义 讨论here htt
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • Win32 API:如何读取序列号,或者如果不是数据则在超时内退出

    我需要一个函数来从串行端口读取数据 或者如果在时间间隔内没有数据则返回 例如 在 GNU Linux 上你可以使用poll orselect read Windows 中有类似的东西吗 下面是我尝试过的 它应该可以工作 但是功能获取重叠结果
  • ListView 多选行为?

    Comtl32 dll v6 0中的ListView进行多项选择 使用Shift键时 如下 x表示选择 00xxxx xxxxxx xxxx00 早期版本的 ListView 的做法如下 00xx00 00xx00 00xx00 有没有办法
  • win32 API 和 .NET 框架之间的选择

    我必须开发一个适用于 Windows 的应用程序 该应用程序将能够通过网络摄像头识别手势来控制鼠标 我将使用 vc 2008 进行开发 但我很困惑是使用 NET 框架还是核心 win32 API 性能对于我的应用程序非常重要 根据 Ivor
  • 如何取消同步 WinHttp 请求?

    我的服务有一个线程可能正在执行WinHttpSendRequest当有人试图停止我的服务时 The WinHttpCloseHandle 文档 http msdn microsoft com en us library windows de
  • 在 Android 上将大位图文件的大小调整为缩放的输出文件

    我的文件中有一个大位图 例如 3888x2592 现在 我想将该位图大小调整为 800x533 并将其保存到另一个文件中 我通常会通过调用来缩放位图Bitmap createBitmap方法 但它需要一个源位图作为第一个参数 我无法提供它
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 具有自定义镶边的 WPF 窗口在右侧和底部有不需要的轮廓

    我使用 Microsoft Windows Shell dll 创建了带有自定义镶边的 WPF 窗口 这是代码
  • 检查Windows电源管理是否关闭了显示器

    如何在 Windows 7 和 XP 中以编程方式检查 Windows 电源管理 是否已关闭显示屏 如果能收到一个活动就更好了 我不认为 XP 可以做到这一点 Windows 7 中有各种与电源管理相关的好东西 这Windows API 代
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • Android 改变 ImageView / Bitmap 的颜色

    我需要找到一种方法来改变 Android 中位图的颜色 我需要在我的应用程序中平滑地替换 更改椭圆形图像的颜色 具体取决于int价值 我需要类似的东西myValue 5比改变我的图像的颜色RED and if myValue 322将颜色更
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 使用 dpi 与 dp 缩放图像之间的差异

    我拥有所有由九个补丁位图组成的 dpi 可绘制目录 xxhdpi 和 xxxhdpi 是否必要 可绘制目录中的可绘制资源文件可检索所有缩放的位图 并且我使用可绘制资源文件 现在 我的问题是我还根据大小 小 正常等 创建了 缩放 布局目录 其
  • 如何检查 NTAccount 对象代表组还是用户?

    使用返回的访问规则时 GetAccessRules True True GetType System Security Principal NTAccount 如何判断每个规则中引用的 NTAccount 对象是用户帐户还是组 Update

随机推荐

  • 防止 Angular NativeScript WebView 通过捏合缩放进行缩放

    所以我有一个使用 Angular NG 5 1 1 Angular 7 x 的 Nativescript 应用程序 我有一个带有网络视图的视图 ViewChild myWebView webViewRef ElementRef
  • Webview 在冰淇淋三明治中显示白色空白页

    在我的网络视图中 我加载了一个 URL 其中包含电视频道直播的嵌入式视频播放器 它在除 ICS 4 之外的所有 Android 操作系统版本中都能正常工作 第一次它可以很好地播放视频 但是当我返回并再次进入包含视频的页面时 视频不会加载并显
  • 查找目录中最后创建的FILE,C++

    尽管我在网上搜索过 但没有任何像我这样的问题 我的问题是 我想获取目录中最后创建的文件的名称 我的系统将在该代码的目录中创建来自我的相机的 png 文件 我希望我的代码采用最后创建的文件 我想用这段代码来做 string processNa
  • 在 pyspark 中找不到 col 函数

    在pyspark 1 6 2中 我可以导入col函数由 from pyspark sql functions import col 但当我尝试在GitHub 源代码 https github com apache spark blob br
  • 寻找可与 Google App Engine 配合使用的 python 视频编辑/处理功能

    是否知道任何可与 Google App Engine 配合使用的 python 视频编辑 处理库或框架 我需要在我的 App Engine 网站上以语法方式编辑视频文件 添加配乐 在顶部分层视频剪辑等 由于大多数视频 音频编解码器都是用 C
  • pip install - PermissionError:[Errno 13]权限被拒绝

    环境 视窗8 1 Python 3 5 Anaconda Issue 当我做pip install sklearn upgrade 我收到以下错误 Exception Traceback most recent call last File
  • 链接到 OSX 上的 iOS 模拟器二进制文件

    我很好奇如果我链接到 Mac 应用程序中的 iOS 模拟器框架会发生什么 因此 我将 UIKit 复制到它自己的文件夹中 因此框架搜索路径不会包含所有 iOS 模拟器框架 就像 CoreFoundation 在 Mac 和 iOS 上都存在
  • 无法在 Codeigniter 中取消链接文件

    在我的项目中我有一个文件夹secure在根中 项目包如下所示 application secure system 在安全文件夹内 我正在使用表单提交上传一些图像 config1 upload path secure ext end expl
  • Qt Widget 应用程序“库未注册”错误

    我最近刚刚开始使用 Qt 并创建了一个简单的 Qt Widgets 应用程序 当我构建并运行应用程序时 即使我创建了一个没有新代码的新项目 我收到以下错误消息 mincore com oleaut32 dispatch ups cpp 21
  • 如何在 Windows 中从 PHP 函数 exec() 获取 PID?

    我一直用 pid exec usr local bin php file php args gt dev null echo 但我正在使用 XP 虚拟机开发 Web 应用程序 我不知道如何在 Windows 中获取 pid 我在cmd上尝试
  • 使用 Freebase MQL 读取 google api 的非唯一查询

    看来我只能使用新的 freebase MQL 读取 api 执行唯一查询 即在查询中包含实体 id 以下是对 id 和 type 的搜索 https www googleapis com freebase v1 mqlread query
  • Python在函数调用之外获取变量名[重复]

    这个问题在这里已经有答案了 让我们有下面的代码 def f a b c import inspect stack inspect stack How to know the original variable names i e arg1
  • 按 Pandas DataFrame 中的连续索引分组

    我正在使用 python 编写传感器数据分析代码 我根据某些条件从 DataFrame 示例中的陀螺仪数据 中获取行 import pandas as pd gyro pd read csv gyroOutput csv above gyr
  • 可以在 PHP 的类中使用静态常量吗?

    我预计以下内容会起作用 但似乎没有
  • 将可点击的 SVG 图像插入 Sphinx 文档

    我有 SVG 图像文件 其中有多个节点 每个节点都与 URL 关联 如果我直接在浏览器中打开此文件 我可以单击每个节点 它将打开不同的 URL 但是 当我在 Sphinx 文档中使用这张图片时 它不起作用 图片作为一个整体呈现 所以我需要通
  • Android CookieManager setCookie 创建多个cookie

    在我的 Android 应用程序中 我有一个网络视图 它从多个域加载 URL 我需要删除特定域中的所有 cookie 我想保留来自其他域的 cookie 但我需要删除一个域中的所有 cookie 我对处理我的请求的所有其他解决方案持开放态度
  • IT公司项目选择时如何决策? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 他们选择项目的标准是什么 他们选择项目的依据是什么 如果他们想继续经营下去 就需要投资回报
  • Groovy 中的单元测试抽象类

    我是单元测试和模拟的新手 我正在尝试对 Grails 中的抽象域类进行单元测试 我应该如何模拟实现 以便可以对域类的约束进行单元测试 有没有办法使用 groovy 或 grails 附带的模拟库 我应该只实现一个简单地扩展抽象类的类吗 gr
  • 如何从 javascript 发送curl 请求?

    我想发送这个 curl https fcm googleapis com fcm send H Content Type application json H Authorization key
  • 从加载到内存的 24 位 BMP 文件中获取 HBITMAP

    我有一个 24 位 BMP 文件加载到 RAM 中 我正在尝试为此图像文件创建一个 HBITMAP 我发现了一些我一直在尝试的例子 但似乎无法发挥作用 基本上 我需要该文件的 HBITMAP 以便我可以卸载该文件并保留 HBITMAP 稍后