问题标签 [createdibsection]

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 投票
2 回答
5731 浏览

c++ - 创建 DIBSection 失败

// 在 CreateDIBSection 之后我发现错误代码是 8,没有足够的资源。

我怎样才能避免这个错误?我通过宽度:3500 高度 2500 非常感谢!

0 投票
2 回答
571 浏览

multithreading - 关于线程中 CreateDIBSection 的调用

在名为 buildtexture 的函数中,它为 OpenGL 加载图像并构建纹理,当我调用 CreateDIBSection 时,它将创建一个位图。如果函数 buildtexture 作为普通成员函数调用,则不会有任何问题。但是如果我在一个线程中调用这个成员函数,CreateDIBSection 将返回 0,这意味着它失败了。甚至 GetLastError 在调用 CreateDIBSection 后也返回 0。我猜线程没有足够的空间来创建位图。而且我不知道如何解决这个问题。任何人都可以帮助我吗?非常感谢!

0 投票
1 回答
351 浏览

c++ - 尝试在 Win 上创建光标时,CreateDIBSection 正在抛出

我正在尝试从 png 中创建光标,并且CreateDIBSection()正在投掷。

以下是代码片段:

就像CreateDIBSection抛出一样,释放 DC 的代码没有被执行。你能告诉我这背后可能存在的问题吗?

0 投票
3 回答
3011 浏览

c++ - CreateDIBSection 留下“存储空间不足”错误,但似乎仍然有效

每当我的应用程序尝试通过调用 CreateDIBSection() 或使用LR_CREATEDIBSECTION标志调用 LoadImage() 来创建 DIB 部分时,它似乎都会成功返回。它返回的HBITMAP是有效的,我可以很好地操作和显示它。

但是,对 GetLastError() 的调用将返回8: Not enough storage is available to process this command. 这从第一次调用到最后一次调用都会发生。请求的位图大小似乎无关紧要;800x600 或 16x16,结果相同。在函数调用之前,GetLastError() 没有返回错误;此外,在函数调用之前调用 SetLastError(0) 具有相同的结果。

我发现其他人提出了类似的问题,但事实证明他们正在使用 CreateCompatibleBitmap() 并且当他们切换到 CreateDIBSection() 时问题就消失了,或者他们已经在使用 CreateDIBSection() 并且它返回的结果是无效的,所以根本不工作。

由于事情似乎正在工作,我认为我可以忽略它(并在调用任一函数后调用 SetLastError(0)),但这样做可能会忽略一些微妙的问题。

当然,这是我正在使用的一些基本代码。首先,对 LoadImage() 的调用,它是基本位图类的一部分,我用于很多事情,并且我对其进行了相当多的简化以显示更相关的方面:

更新分层窗口时通常会调用 CreateDIBSection:

任何关于我完全偏离基础的任何指示都将不胜感激。

0 投票
1 回答
2223 浏览

c++ - 16 位桌面颜色深度中的 BitBlt + UpdateLayeredWindow 和 CreateDIBSection

我在客户区有一个透明背景的应用程序,因为窗口没有分层,所以它被绘制为黑色。在它的每一条 WM_PAINT 消息中,我都在对内存 DC 执行 BitBlt,之后我使用带有 UpdateLayeredWindow 的内存 DC 到分层画布窗口。

内存-DC的设置:

在 WM_PAINT 中,我使用 BitBlt 函数将应用程序客户区 DC 信息复制到内存 DC。之后,我将使用内存 DC 执行 UpdateLayeredWindow 到分层画布窗口 DC(它的 CWnd)。所以它是实时的,结果是:我有一个正常的应用程序窗口和一个分层的窗口,除了不规则的形状和每像素的透明度。

在 32 位桌面颜色深度下一切正常!如果我切换到 16 位,分层画布窗口就会变得混乱。绘图看起来很糟糕,整个窗口虽然可以点击。

它认为这是因为缺少 alpha 通道信息。

所以我在谷歌上搜索了很多解决方案。我发现在这种情况下,我必须使用

而不是 CreateCompatibleDC(NULL)。因为兼容的 DC 会给我一个 16 位的 DC。

使用 CreateDC 绘图效果更好。但是整个窗口仍然是可点击的,并且在分层窗口中透明度被绘制为黑色。

所以我认为问题出在 BitBlt 或 CreateDIBSection 的 BitmapInfoHeader 上。

  1. 我不知道是使用 BitmapInfoHeader.biBitCount = 32 还是 BitmapInfoHeader.biBitCount = 16 位。认为它是 32。那么 biCompression -> BI_RGB 或 BI_BITFIELDS 呢?

  2. 如何在 BitBlt(..., SRCCOPY) 16 位 DC 到 memory-DC 之后将 alpha 通道信息添加到 memory-DC,以便它与 UpdateLayeredWindow 一起使用?(也许:将 rgb 通道与 alpha 通道预乘?)不知道该怎么做。


我稍微接近了 16 位桌面颜色深度问题。

以上似乎工作。但是我的 UpdateLayeredWindow 函数产生的结果看起来很乱。

所以,这是因为缺少黑色!每个全黑的像素都变得透明。您可以查看并单击。所有其他像素都失去了黑色部分,只能点击通过。

我做了一个测试:我打开了Windows Paint.exe,制作了一个窗口宽度和高度以及黑色作为填充颜色的表面。

然后我把它放在我的分层窗口下(缺少黑色),再次将分层窗口作为前景窗口,然后ta-da,我的分层窗口与通过Paint.exe黑色像素的闪耀相结合看起来很正常。

所以我用 BitBlt 过期了,它又是光栅操作参数。但没有运气。

在使用 UpdateLayeredWindow 绘图之前,如何将黑色与 BitBlt 混合到我的 DC 中?

0 投票
1 回答
1142 浏览

c++ - 磁盘上的 CreateDibSection 而不是物理内存

我在使用一种算法来“展平”PDF 文档中的页面时遇到内存问题。

问题是我有一个非常大的位图,在某些情况下,当我分配要复制的 DIB 时,我无法将 HBitmap 保留在内存中。

所以这是一个很长的镜头,但我可以以某种方式在磁盘上分配 Dib 部分并且仍然有一个 HBITMAP 吗?(对我的 ConvertBitmap 函数使用相同的句柄)

0 投票
1 回答
2935 浏览

c++ - 为什么 CreateDIBSection() 因某些 BITMAPINFO 而失败?

我正在尝试使用CreateDIBSection.

问题:

在 Windows XP 中,我尝试调用CreateDIBSection,它返回NULLand GetLastError= 0

当我尝试将屏幕分辨率更改为 2048 x 1536 时,它会返回正确的值。

我已经测试过这个函数与nMemSize(不一定是小数)有一定的关系。

问题:

有什么保证方法可以确保CreateDIBSection返回正确的值吗?

0 投票
0 回答
1238 浏览

c++ - 为什么在屏幕解决方案更改时 CreateDIBSection 返回 NULL 而 GetLastError 返回 0?

以下是我的代码:

我的操作系统是windows xp,屏幕分辨率是1024*768,调用函数:

我发现 CreateDIBSection 返回 NULL 而 GetLastErr() 返回 0。但是当屏幕分辨率为 2048*1536 时,调用该函数:

我发现 CreateDIBSection 返回一个有效的句柄。

为什么 ?

似乎屏幕分辨率导致 CreateDIBSection 返回无效值,我不知道为什么。

但在某些 WINXP 中,无论屏幕分辨率如何,CreateDIBSection 总是成功。从测试来看,我认为原因与HDC有关。HDC与屏幕分辨率有关吗?

0 投票
0 回答
1185 浏览

delphi - 尝试将 TBitmaps 写入 AVI 文件并仅获取黑帧(全零数据)

我有一个 Delphi 应用程序,它从文件中读取 JPEG 帧并将它们写入 AVI 文件。每个 JPEG 帧都被解码为一个 TBitmap 对象,然后使用由用于 AVI 操作的 Windows API DLL (AVIFIL32.DLL) 提供的服务,通过 Delphi 6 VFW.PAS 单元写入一个输出 AVI 文件。

问题是我最终在输出文件中出现了所有黑框。我知道在调用 AVIStreamWrite() 之前用作源的 TBitmaps 具有有效数据,因为我已使用 TBitmap.SaveToFile() 方法将它们写入磁盘并且源图像看起来很好。但我仍然以黑框结束。我从 TBitmap 获取位的方式有问题,因为如果我检查它指向的内存区域,GetDIBBits() 返回的指针显示所有零。

下面是我的代码。我究竟做错了什么?此外,如果我尝试释放 CreateDIBSection() 返回的第一个 pBits,我会遇到访问冲突。这是正常的还是有一些适当的方法可以释放它?

0 投票
1 回答
1140 浏览

c++ - Bitblt,createdibsection,图像损坏

嗨,我正在尝试捕获屏幕截图,但图像已损坏,任何人都可以看到代码有什么问题,基本上我正在尝试使用 createdibsection,因此我可以直接访问这些位。

这是生成的图片的样子 http://oi47.tinypic.com/33c4zko.jpg

这就是代码,然后我只是用它来捕获屏幕