问题标签 [dib]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Win API 中的内存 DC 有多便宜/多贵?
我正在开发一个程序,该程序将具有许多 DIB 位图(由 创建CreateDIBSection
),并且必须使用 Win API 在它们上绘制大量文本。
为了在位图上绘图,Windows 需要设备上下文,由CreateCompatibleDC
.
现在这里有两种方法:
我可以为每个位图创建一次 DC,将其用于绘图并在释放位图时将其删除。
或者我只能在需要绘制位图、调用绘制函数并删除 DC 时创建 DC。
更好的方法是什么?我更喜欢第一个,因为调用更少 - 这将使我的代码更小,也更快一点。
但是为每个位图保存一个长寿命的 DC 是不是太昂贵了?
编辑1:该应用程序实际上是一个 GUI 工具包库,将来可以以不同且不可预测的方式使用,因此我需要一个平衡的决策,以尽可能提高性能和最少的系统资源使用。
c++ - 从打包的 DIB 空指针复制
我正在开发一个用 C++ 编写的用于缓存 GDI 对象的 API,我在其中实现了模仿 win32 API 的不同 Create 方法。一种这样的方法是CreateDIBPatternBrushPt()
,它将 a 接收VOID*
到打包的 DIB 中。VOID*
包含一个结构,BITMAPINFO
后面紧跟一个定义位图像素的字节数组。我对打包的 DIB 进行了一些研究。根据这本书,Programming Windows 以及 Wikipedia,长度等于行长度和biHeight
(的成员BITMAPINFOHEADER
)的乘积,其中:
所以,目前我的想法是做这样的事情:
这似乎是一种有效的方法吗?我还想知道lpPackedDIB
使用 的人会从哪里来CreateDIBPatternBrushPt()
,以便我可以正确测试这个逻辑。
编辑:
参考资料: https ://msdn.microsoft.com/en-us/library/windows/desktop/dd183493(v=vs.85).aspx https://en.wikipedia.org/wiki/BMP_file_format#File_structure https:// /www-user.tu-chemnitz.de/~heha/petzold/ch15b.htm(特别是“DIB 像素位”部分)
ffmpeg - 将 rtsp 流转换为 bmp 图像
我有一个要求,我必须将 RTSP 视频流转换为 BMP 图像,然后传递给我的人脸检测应用程序。那么是否可以使用 ffmpeg 工具来做同样的事情呢?如果没有,那么任何人都可以指导我使用正确的工具/一些相同的自定义代码。
提前致谢!!
c - 从 Windows 剪贴板获取 32 位 RGBA 图像
我希望我的应用程序(适用于 RGBA8888 图像)能够从 Windows 剪贴板粘贴图像。所以它应该能够从剪贴板上读取来自任何常见光栅图像应用程序(如 Gimp、Photoshop、MSPaint 等)的图像。
通过阅读剪贴板功能,看来我应该可以调用GetClipboardData(CF_DIBV5)
几乎可以访问剪贴板上的任何位图类型,因为 Windows 会自动在它与 CF_BITMAP 和 CF_DIB 之间进行转换。但是通过阅读 DIB 格式,我发现位深度、RGB 顺序、可选压缩等的可能组合有很多。看起来我正在做的事情将是一项常见的任务,但我没有在 Windows API 中看不到任何转换函数(除非我不擅长搜索),这似乎需要一周的时间来编写以支持所有可能的格式。所以我想知道我是否忽略了一些明显的事情。或者,如果我可以做出某种假设来简化这一点……例如,如果所有流行的图像应用程序碰巧以未压缩/未索引的格式将图像复制到剪贴板。
更新:这是我到目前为止所拥有的:
更新 2:
澄清一下,我需要字面上未压缩的 32 位图像数据 (RRGGBBAA),我可以在跨平台应用程序中进行操作,但我喜欢它。我不需要使用 Windows API 来将此图像绘制到屏幕上。
我知道一个名为的第三方库stdb_image.h
可以将 .bmps、.jpgs 和 .pngs 加载到我需要的数据类型中。因此,如果有一种方法可以将剪贴板数据转换为位图或 png 文件数据而不会丢失 alpha,那么我的状态会很好。
delphi - How to save Windows.tagBitmap to stream as a full DIB?
from a third party component I am receiving a PBitmap
which is a pointer to Windows.tagBitmap
record.
I would like to convert data contained in this pointer to a regular DIB
and save this data to a stream. Just as Graphics.TBitmap.SaveToStream
does.
So preferably I would like to have a procedure like:
I've tried to find information about this structure on MSDN, but none of the headers described there (BITMAPFILEHEADER
, BITMAPINFOHEADER
etc.) seems to conform tagBITMAP
.
Could someone experienced in the matter could help me?
edited: An example in in C \ C++ would also be fine for me.
windows - 如何从剪贴板内存 (uintptr) 中检索图像数据缓冲区?
我正在尝试使用带有 user32.dll 的系统调用来获取剪贴板的内容。我希望它是来自打印屏幕的图像数据。
现在我有这个:
我需要使用句柄将数据放入可读缓冲区。
我从 github 上的 AllenDang/w32 和 atotto/clipboard 获得了一些灵感。根据 atotto 的实现,以下内容适用于文本:
但是我怎样才能得到一个包含我可以解码的图像数据的缓冲区呢?
[更新]
按照@kostix 提供的解决方案,我编写了一个半工作示例:
AllenDang/w32 包含您需要的大部分内容,但有时您需要自己实现一些东西,例如 globalSize():
也许有人会想出一个解决方案来获取 BMP 数据。与此同时,我将采取不同的路线。
c++ - SetDIBitsToDevice 仿真
我是 DxWnd 工具的作者,该工具试图为在现代 Windows 环境中运行旧程序和遗留程序提供支持。
一个非常奇怪的游戏是 G-Nome,尽管它能够在 Win7-10 系统上原生运行,但给图形处理带来了严重的问题。
游戏链接到 ddraw,但将每一帧构建为DIB,并使用user32 调用DIB_PAL_COLORS
将 DIB 带到屏幕上。SetDIBitsToDevice
视频上的 DC 类型也支持该操作,也支持OBJ_DC
32 位色深视频模式,但在应用于 MEM_DC 类型 DC 时会产生不良颜色。我在尝试使用像这样的典型模式扩展 DIB 时发现了这一点(为简洁起见,去掉了变量声明和错误检查):
根据 MSDN,当您输出DIB_PAL_COLORS
DIB 时,像素被映射到“当前”实现的调色板,但当然在 32 位表面和其内存 DC 克隆上根本没有调色板,所以难怪像素颜色看起来都错了。
另一种解决方案可能是模拟SetDIBitsToDevice
构建 32 位内存 DC 的行为,然后随意缩放StretchBlt
,但同样没有记录我如何将 8bpp DIB_PAL_COLORS
DIB 转换为 32bppDIB_RGB_DIB
或 32bpp DC。
我已经尝试了几种方法,但在所有情况下,我似乎都无法识别用于转换像素索引的正确调色板。有人可以帮我解释 8bpp DIB_PAL_COLORS
DIB 格式吗?
python - 带有 glob 的 Dlib 收集点
我是 python 新手,现在我正在尝试使用 dlib C++ 库收集点的坐标。但我无法理解这段代码。请帮我
windows - 修改 BMP 调色板并保存为正确格式
一个旧的废弃软件游戏使用图像的调色板作为游戏的调色板 https://ufile.io/su465 <- 这是所说的文件
Windows 10 不会将其识别为具有文件类型,但使用在线文件类型检查器表明它是具有 DIB 文件头的 Windows 3.x BMP 文件。我会很感激帮助我弄清楚如何修改这个文件的调色板并能够以(相同)正确的格式保存它,以便游戏仍然可以读取它。
初步实验表明,它可以用 GIMP 之类的编辑器打开,更改调色板,并保存为 .bmp 图像,但我找不到任何生成与原始格式相同的 .bmp 的设置,因此可以读取不正确。