问题标签 [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.

0 投票
1 回答
368 浏览

winapi - DrawToBitmap (DIB) 中未显示 OpenGL Win32 纹理

我有一个实时 OpenGL 应用程序渲染一些带有纹理的对象。我已经构建了一个函数来制作渲染场景的内部屏幕截图,方法是通过 PFD_DRAW_TO_BITMAP 将其渲染到 DIB 并将其复制到图像中。除了一种纹理外,它的效果很好。这些是 24bpp 的 JPG(因此每个 R、G、B 为 8 位)。我可以加载它们,它们可以实时正确渲染,但在渲染到 DIB 时却不能。对于其他纹理效果很好。在虚拟机上测试我的应用程序时我有同样的行为(WinXP,没有硬件加速!)。在这里,这些特定的纹理甚至没有在实时渲染中显示。如果没有硬件加速,我猜 WinXP 使用它自己的 OpenGL 软件实现并回退到 OpenGL 1.1。那么有哪些贴图没有3d硬件加速是无法绘制的呢?还是有一个共同的陷阱?

0 投票
2 回答
1222 浏览

windows - 创建 ARGB DIB

如何创建 ARGB 格式的 DIB。我想使用这个 DIB 对一个图像(其中有一些透明的部分)进行 blit。我尝试使用以下代码,但无法正常工作

请帮忙。

问候,

技术。

0 投票
0 回答
533 浏览

java - 如何使用 JAVA/JNA 将 PointerByReference 图像转换为 Byte[] 然后 BITMAP?

我正在使用 JNA 与扫描仪的库“LSAPI.DLL”一起工作,因此,扫描后我得到一个 frontimg 参数,它是 Dib 格式的指针,所以我必须将其转换为 Byte[] 然后转换 Byte [] 到位图,最后将扫描的图像保存在我的桌面上进行测试。

这是给我 frontimg 指针的方法:

我试图从这个开始,但它不起作用:

有什么办法可以继续吗?

0 投票
0 回答
328 浏览

c++ - C++ WINAPI CreateDIBitmap 麻烦

我编写了一个程序,它将位图文件(仅)加载到窗口中,它适用于任何具有扩展名的文件.bmp。但是我在进行测试时遇到了下一个问题。我拿了一个带有扩展名的文件.jpg,将其打开,Paint然后将其保存为 BMP 文件。当我开始使用这个新文件进行测试时,我的程序加载了一个黑色窗口。

我进行了调试,发现结构biColorUsed字段BITMAPINFOHEADER为零。根据doc,这意味着

位图使用与 biBitCount 成员的值对应的最大颜色数,用于 biCompression 指定的压缩模式。

biCompression字段也为零,这意味着文件未压缩。

biBitCount等于 24 这意味着(根据相同的文档)

bmiColors 颜色表用于优化基于调色板的设备上使用的颜色,并且必须包含由 BITMAPINFOHEADER 的 biClrUsed 成员指定的条目数

无法指定,因为biClrUsed它为零。

所以,问题是,文件是通过文件BMP转换创建的吗?JPGPaintBMP

PS 我在我的程序中使用 CreateDIBitmap 函数。当我BMP使用 LoadImage 加载相同的文件时,它工作正常。结构的任何其他字段BITMAPFILEHEADERBITMAPINFOHEADER都已正确加载。这就是为什么我认为我可以从BMP文件中正确加载数据。我可以将我的项目上传到 GoogleDrive,然后在需要时分享。

0 投票
0 回答
222 浏览

c++ - 将任何图像转换为 DIB 的最节省内存的方法是什么?

在我的应用程序中,我必须将图像(图像可以是任何格式 - PNG、JPEG、BMP 等)转换为 DIB。

这就是我现在正在做的,

  1. 使用 GlobalAlloc(GHND,0) 创建一个可移动的全局内存
  2. 使用 CreateStreamOnHGlobal() API 在这个全局内存上创建一个流
  3. 使用 BITMAP 的编码器将给定的图像保存到流中
  4. 然后我创建另一个缓冲区并将内容从全局内存复制到新创建的缓冲区,跳过位图文件头。 这使得新分配的缓冲区成为 DIB 数据
  5. 最后使用 GlobalFree() 释放全局内存并释放流。

我在这里感到不舒服的是,这里分配了很多内存来将图像转换为 DIB。我想知道是否有任何其他方法可以仅使用最少的内存分配和取消分配来实现这一目标。

0 投票
1 回答
667 浏览

python - Pygame 错误:无法创建 DIB 部分

我刚刚从它的网站( http://pygame.org/download.shtml )的下载页面下载了pygame(python模块),我选择了名为“pygame-1.9.1.win32-py2.7.msi”的包. 当我试图执行一个程序时,我得到了这个错误:

我不知道这是什么意思。有人可以帮我吗?

我使用的是 64 位 Windows 7 hp 笔记本电脑。有问题的程序是试图可视化“兰顿的蚂蚁”,它是这样的:

0 投票
2 回答
4743 浏览

c++ - MFC BitBlt 和 SetDIBits 与 SetBitmapBits

我有一个存储为 BGRA 字节数组的位图。这是我用来绘制位图的代码:

translatedImage数组中像素的实际复制是这样发生的:

然后经过更多处理后,我将pDC->StretchBltdispDC作为源 CDC 调用。这在本地登录时工作正常,因为显示也设置为 32bpp。

一旦我使用远程桌面登录,显示将变为 16bpp,并且图像被破坏。罪魁祸首是SetBitmapBits;即为了让它工作,我必须正确填写translatedImage我想要显示的 16bpp 版本。我没有自己做,而是搜索了文档,发现SetDIBits它听起来像我想要的:

SetDIBits 函数使用在指定 DIB 中找到的颜色数据设置兼容位图 (DDB) 中的像素。

在我的例子中,DIB 是 32bpp RGBA 数组,而 DDB 是dispBMP我用CreateCompatibleBitmap.

所以我没有打电话给SetBitmapBits,这就是我所做的:

但是,r始终为零,当然,我的窗口中除了黑色之外什么也没有。代码有什么问题?

0 投票
3 回答
24353 浏览

c++ - C++:将 Hbitmap/BITMAP 转换为 .bmp 文件

好的,整个故事是,我正在尝试在 C++ 中使用 Leptonica+Tesseract OCR 来截取屏幕截图,将其保存到 *.bmp 文件,然后将其加载回 OCR。我不需要经常这样做,但由于我似乎无法将屏幕截图数据直接复制到 Leptonica PIX 结构中,所以我需要先将其保存到文件中。实际上,最好有一个解决方案。

这是我在网上找到的一些代码,试图帮助我。

屏幕盖:

尝试编写函数:

多年来无耻地抄袭人们的帖子。好的!我面临的问题是,我似乎无法理解如何将 Hbitmap 全局分配到全局可访问的句柄中,该句柄可以转换或与 LPBITMAPINFOHEADER 一起使用。创建 lpbi 后,其中的每个字段在 Visual Studio 2012 调试中都是“无法读取内存”错误。它是不可访问的,尽管被创建了。

解决方案..直接从屏幕截图到 PIX,在内存中..找到一种方法来保存到位图并定期创建它们以供阅读..找到另一种更有意义的方法..

更喜欢第一个,但是,我要求解决这个问题,而不是第二个..或第三个。

如果您需要更多信息,我可以尝试提供。这主要归结为“我以前从未做过这样的代码,而且我的课堂上也没有教过它,所以我正在努力学习”。

0 投票
1 回答
745 浏览

c++ - 创建、显示和访问位图/DIB 数据(w/o GetBitmapBits())

我继承了一个老式的 MFC Windows CE 程序,并且必须对其进行一些修改。作为其中的一部分,我必须创建一个带有文本的单色图像,并将其显示在屏幕上,并一次将图像的每一行发送到打印机。

我最初使用的是位图,并且成功地使用了 DrawText() 并获得了要在屏幕上显示的测试字符串 (Hello World)(此代码在图 1 中)。但是,在我希望从位图中提取换行数据的阶段,我碰壁了。我想要得到的是一个 1 或 0 代表黑色或白色的数组。我一开始以为我会使用 GetBitmapBits() 但不幸的是,我正在使用的代码太旧以至于还不支持该功能。我想我可以通过使用 GetBitmap() 然后访问 bmBits 参数来解决这个问题。但是,这似乎始终为空,当我找到以下链接时已确认这一点:为什么 GetObject 返回带有空 bmBits 的 BITMAP?.

我的下一个尝试是遵循链接中的建议并使用 CreateDIBSection() 而不是 CreateCompatibleBitmap()。这似乎是正确的路径,我应该可以访问我想要的数据,但不幸的是我无法让 DIB 显示(代码在图 2 中)。我怀疑我在创建 DIB 的标头时做错了什么,但我无法弄清楚我的错误是什么。

如果有人对访问位图中数据的方法有建议,或者可以看到我在 DIB 上做错了什么,我将非常感谢您的帮助!

*** 图 1:创建和显示位图的代码

*** 图 2:尝试使用 DIB 而不是位图

}

0 投票
1 回答
908 浏览

c++ - 如何仅使用直接 WinAPI 将与设备无关的位图放入 Windows 剪贴板?(没有 MFC 或其他包装器)

我一直试图让它工作一段时间,但我似乎无法弄清楚,而且谷歌搜索数小时还没有显示任何有用的结果。

我有一个 RGBA 顺序的 32 位像素数组,我想从它们创建一个与设备无关的位图,并使用SetClipboardData(CF_DIBV5, dib)或类似方法将其放置在剪贴板上(理想情况下,我想保留 alpha 通道)。注册自定义剪贴板类型不是一种选择,因为将其放在剪贴板上的目的是可以将其粘贴到另一个程序中。如果我不必手动将像素数据转换为其他格式(例如平面 BGRA),则可以加分。

我当前的代码是这样的(都在 set_clipboard_img 函数中):

最终,我还需要能够扭转这个过程(从剪贴板上获取一个可能透明的位图),但一次只做一件事。