从内存缓冲区创建 HBITMAP

2023-12-30

我有一个应用程序,它从数据库中加载一些 blob 数据,这些数据可以表示 png 格式或各种位图和图标的原始二进制数据。这被存储在std::vector<unsigned char>

我在用着CImageList用于在树视图、工具栏图像等中显示各种图像的对象,但问题是从内存中的数据创建位图会变得模糊,就像在执行如下操作时缺少像素一样:

std::vector<unsigned char> bits;
HBITMAP hbitmap = CreateBitmap(16, 16, 1, 32, bits.data());

为了暂时解决这个问题,我只需将向量中的 data() 写入临时文件,然后使用 LoadImage 将其读回并从中创建 HBITMAP。这工作得很好,但是这无疑是一个无耻的黑客行为,我希望这应该是完全没有必要的。

我在网上查了一下,但没有找到任何关于如何“正确”从内存创建 hbitmap 的真正好的例子。我希望能够创建这些位图并将其添加到图像列表中,而无需任何文件 I/O,并且如果可能的话,也无需复制有限数量的数据。

寻找最好的方法来做到这一点,显然 Windows 特定的代码是可以的。

UPDATE:

根据 jdv 的回答,我开始使用 CreateCompatibleBitmap、CreateDIBitmap,最后是 CreateDIBSection。所有这些最终都创建了可爱的黑色位图,而不是之前的模糊位图,所以我一定又做错了什么,我的猜测是因为这个位图创建是在一个没有屏幕 dc 或窗口概念的对象中完成的GetDC(NULL) and CreateCompatibleDC(NULL)都不好。示例代码:

    BITMAPINFO bmi;
    ZeroMemory(&bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biHeight = 16;
    bmi.bmiHeader.biWidth = 16;
    bmi.bmiHeader.biPlanes = 1;

    HDC dc = CreateCompatibleDC(NULL);
    HBITMAP hbitmap = CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (void**)blobData.GetMember<FILEDATAFIELD_DATA>().data(), NULL, 0);

我现在当然认为必须有一种更简单的方法来解决这个问题,也许可以完全避免 HBITMAP 并直接与CBitmap班级?当涉及到将图像添加到CImageList我在用着CBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask)反正。有谁知道初始化一个简单的方法CBitmap对象从一个std::vector<unsigned char>?


I'd use CreateCompatibleBitmap,然后调用SetDIBits用您的数据填充它。这些是我见过的有效函数,SetDIBits 非常灵活,尽管很冗长。

在我的 MFC 岁月里,CreateBitmap由于怀疑性能问题而被避免。

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

从内存缓冲区创建 HBITMAP 的相关文章

  • 实体框架中的重复键异常?

    我试图捕获当我将具有给定用户名的现有用户插入数据库时 引发的异常 正如标题所说 我正在使用 EF 当我尝试将用户插入数据库时 引发的唯一异常是 UpdateException 如何提取此异常以识别其是否是重复异常或其他异常 catch Up
  • ProtoBuf-net AsReference 需要 Activator.CreateInstance 中的公共构造函数吗?

    在我的两门课程中 看起来像这样 最少 using System using System Collections Generic using System Collections using System ComponentModel us
  • 何时对向量进行归一化?

    我正在学习 XNA 并且在几乎所有的教育套件中都可以找到http creators xna com en US http creators xna com en US 我总是看到向量上对 Normalize 的调用 我知道归一化基本上将向量
  • 在 MVC 类上创建主键字段

    我是 MVC 和 C 新手 我只是偶然发现它并发现它很有趣 我遇到了一个不允许我继续的问题 这是我的代码 using System using System Collections Generic using System Linq usi
  • 当我尝试使用 AVX 功能时,Clang 生成错误

    我使用的是 Windows 10 使用 Clang 版本 5 最近安装 当我编译以下内容时 define AVX define AVX2 include
  • 如何在 C++ 的子目录中创建文件?

    这是我的代码 如何在子目录联系人中创建文件 每次创建该文件时 它都会出现在与我的程序相同的目录中 int main ofstream myfile contacts myfile open a myfile close 在构造函数中指定完整
  • 实体框架7审计日志

    我正在将一个旧项目移植到 ASP NET 5 和 Entity Framework 7 我使用数据库优先方法 DNX 脚手架 来创建模型 旧项目基于Entity Framework 4 审计跟踪是通过重写实现的SaveChanges的方法D
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • 在 C++ 中处理音频缓冲区时,如何执行从 float -> double -> float 的转换

    我目前正在开发一个应用程序 其中音频样本帧在以下回调中进行处理 void Eav07AudioProcessor processBlock AudioSampleBuffer buffer for int channel 0 channel
  • IClaimsTransformation 未触发

    我尝试过实施一个IClaimsTransformation我在 ASP NET CORE 3 1 Web 应用程序中找到的类 public class ClaimsTransformer IClaimsTransformation publ
  • 从 ef core 的子集合中删除一些项目

    我有一个父表和子表 其中父表与子表具有一对多关系 我想删除一些子项 并且希望父项的子集合反映该更改 如果我使用删除选定的子项RemoveRange 那么子集合不会更新 如果我使用Remove从子集合中删除子集合然后 显然 它不如使用效率高R
  • IBM Watson 对话服务错误:无法从“方法组”转换为“conversation.onMessage”

    我正在尝试运行 IBM Watson会话服务团结和下面是代码片段 https github com watson developer cloud unity sdk conversation private Conversation m C
  • 如何使用 C# 代码使用超链接的 onClick 事件?

    我正在尝试为页面中的超链接添加条件 而不是仅仅使用特定的链接 例如 a href help Tutorial html Tutorial a 我想为不同的用户显示不同的页面 例如 如果用户以管理员身份登录 他们将看到与普通用户不同的链接 我
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一
  • 如何使用eclipse构建C++应用程序

    我已经从以下位置下载了 Eclipse Juno for C here http www eclipse org downloads download php file technology epp downloads release ju
  • 停止 TcpListener 的正确方法

    我目前正在使用 TcpListener 来处理传入连接 每个连接都有一个线程用于处理通信 然后关闭该单个连接 代码如下 TcpListener listener new TcpListener IPAddress Any Port Syst
  • 检索 Autofac 容器以解析服务

    在 C WindowForms 应用程序中 我启动一个 OWIN WebApp 它创建另一个类 Erp 的单例实例 public partial class Engine Form const string url http 8080 49
  • 统一;随机物体移动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在制作一款机器人战斗游戏 我希望敌人随机移动 然后有时会向敌人移动 我希望运动包含在其中的代码 else if avoid fal
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • Intel 和 AMD 处理器有相同的汇编程序吗?

    C语言被用来编写Unix以实现可移植性 使用不同编译器编译的同一个C语言程序会产生不同的机器指令 为什么 Windows 操作系统能够在两者上运行Intel https en wikipedia org wiki Intel and AMD

随机推荐

  • 从 HTTP 切换到 HTTPS,失去了所有 Facebook“点赞”计数

    我从http to https两个月前 现在我失去了所有的 喜欢 即使当我使用脸书调试工具 https developers facebook com tools debug 现在它之间的计数相同http and https 有人知道这是否
  • 在类中声明动态 2D 矢量

    我们尝试使用 2D 向量 因为我们想要一个能够动态增长的 2D 数组 我们尝试过这个 在类声明中 vector
  • 使用经典 asp 收集数组中的第一个元素

    我有一个经典 asp 中的二维数组 我的目标是找到该数组中的第一个元素并将其保存在变量中 之后剩余的元素 第一个元素除外 保存在同一个数组中 例子 如果 aryReturn 是一个类似数组 aryReturn 0 0 1001 aryRet
  • Android SDK 管理器中的 MIPS 系统映像是什么?

    对于每个 SDK 我都有一个安装解决方案MIPS system image 它是什么 它有什么作用以及何时有人使用它 如果我不安装它会发生什么 它是什么 它是一个模拟器映像 可模拟具有 MIPS CPU 而不是 ARM 或 x86 CPU
  • 在 PyPy 上运行 Scrapy

    是否可以运行Scrapy on PyPy 我浏览了文档和 github 项目 但唯一的地方PyPy提到的是有一些单元测试正在执行PyPy2年前 参见PyPy support https github com scrapy scrapy pu
  • 布尔值在 Hibernate 和 MySQL 中无法正确映射

    我正在尝试将存在查询的结果 返回 TRUE FALSE 从 MySQL 数据库映射到 POJO 通过结果集转换器 我希望这个存在查询的结果可以映射到布尔值 但它没有并抛出以下错误 org hibernate PropertyAccessEx
  • Android中的ActivityThread异常?

    我正在执行搜索存储在数据库中的位置的任务 之后我必须在相应的位置上放置一个图钉 我对快速搜索框 QSB 进行了修改以搜索我的应用程序中的数据库 为了获得 QSB 性能 我遵循 API 演示中的搜索词典示例 当我单击搜索建议时 它会重新加载当
  • android:使用多个place_id调用Google API .getPlaceById

    为了减少 API 调用次数 我尝试通过一次传递多个 place id 最多 10 个 来查询地点详细信息 除了文档之外 我没有找到任何有用的信息 https developers google com android reference c
  • 需要在 Ruby 中将数组拆分为指定大小的子数组[重复]

    这个问题在这里已经有答案了 我有一个类似这样的数组 arr 4 5 6 7 8 4 45 11 我想要一个像这样的奇特方法 sub arrays split arr 3 这应该返回以下内容 4 5 6 7 8 4 45 11 注意 这个问题
  • 通过url获取json数据并在python中使用(simplejson)

    我想这一定有一个简单的答案 但我很挣扎 我想获取一个 url 输出 json 并在 python 中的可用字典中获取数据 我被困在最后一步了 gt gt gt import urllib2 gt gt gt import simplejso
  • 将 ES6 类对象序列化为 JSON

    class MyClass constructor this foo 3 var myClass new MyClass 我想序列化myClass对象转为 json 我能想到的一种简单方法是 因为每个成员实际上都是 javascript 对
  • 检查整型变量中是否设置了标志

    我正在制作自己的简单绘图引擎 我试图使用我认为所谓的按位比较来确定变量是否已设置为特定值 但我可能错了 我一直对以下内容以及如何使用它感到有点困惑 int DRAW REPEAT X 70001 I have a feeling I sho
  • 将毫秒格式设置为 simpledateformat

    将毫秒格式化为 SimpleDate 格式时 我遇到一个奇怪的结果 输出是 Start date time 11 06 30 09 45 48 970 End date time 11 06 30 09 45 52 831 Executio
  • 使用xquery从xml中提取数据的最佳方法

    考虑以下 xml
  • ValueError:序数必须 >= 1

    这段代码 从谷歌金融获取直线的 2 个坐标 并将第三个点放置在同一条线上一定距离处 import datetime as dt from datetime import timedelta as td import matplotlib p
  • 从 URL 加载图像并将其显示在 iPhone 应用程序中的更快方法

    我使用以下代码在 ImageView 中显示图像 imgbackBG image UIImage imageWithData NSData dataWithContentsOfURL NSURL URLWithString NSString
  • Highcharts 不会调整选项卡内图表的大小

    我正在使用带有选项卡的 Twitter Bootstrap 我有多个选项卡和每个选项卡内的图表 调整浏览器大小后 不在当前活动选项卡上的图表不会调整大小 事实上 它看起来很有趣 有一个细条 当前活动选项卡工作正常 有谁见过这个问题并且有任何
  • 在 tableView 中删除行时出现核心数据错误

    我有一个 UITableViewController 管理分组的 tableView tableView 是从 fetchedResultsController 填充的 如果我点击Edit导航栏中的按钮 然后选择一行并单击Delete按钮
  • 如何让“不适当的阻塞方法调用”变得适当?

    我目前正在尝试更多地利用 kotlin 协程 但我面临一个问题 当在这些协程中使用 moshi 或 okhttp 时 我收到警告 不适当的阻塞方法调用 解决这些问题的最佳方法是什么 我真的不想变得不合适 该警告是关于阻止当前线程和协程无法正
  • 从内存缓冲区创建 HBITMAP

    我有一个应用程序 它从数据库中加载一些 blob 数据 这些数据可以表示 png 格式或各种位图和图标的原始二进制数据 这被存储在std vector