Graphics32:TBitmap32 和错误 "Can't allocate the DIB handle"
Graphics32: TBitmap32 and error "Can't allocate the DIB handle"
我正在尝试创建一个新的 TBitmap32 对象:
Bmp32 := TBitmap32.Create;
Bmp32.SetSize(20000,20000);
然后出现错误:
"Can't allocate the DIB handle"
我该如何解决这个问题? 20K x 20K 位图并没有那么大。它小于 1.5 GB。
这是底层 GDI 接口的限制,您无能为力(据我所知,它往往不同于 OS 和 OS)。
这就是说,并非一切都会丢失,因为您可以使用 TMemoryBackend 或 TMMFBackend(均在 GR32_Backends_Generic 中定义)创建位图,或者您可以尝试 TGDIMemoryBackend,它本质上是一个 TMemoryBackend,但仍然允许在屏幕上绘制位图(而其他后端不直接提供此功能)。
要创建具有不同后端的位图,您只需将后端 class 作为参数传递,如下所示:
BigBitmap := TBitmap32.Create(TMemoryBackend)
或
BigBitmap := TBitmap32.Create(TGDIMemoryBackend)
最终你必须将你的图像保存在一个非可视化的内存位图中,而只是将可视化部分复制到屏幕上。这有点难看,但你不再依赖 GDI,这更难看,因为你永远不知道它是否适用于你客户的机器。
我正在尝试创建一个新的 TBitmap32 对象:
Bmp32 := TBitmap32.Create;
Bmp32.SetSize(20000,20000);
然后出现错误: "Can't allocate the DIB handle"
我该如何解决这个问题? 20K x 20K 位图并没有那么大。它小于 1.5 GB。
这是底层 GDI 接口的限制,您无能为力(据我所知,它往往不同于 OS 和 OS)。
这就是说,并非一切都会丢失,因为您可以使用 TMemoryBackend 或 TMMFBackend(均在 GR32_Backends_Generic 中定义)创建位图,或者您可以尝试 TGDIMemoryBackend,它本质上是一个 TMemoryBackend,但仍然允许在屏幕上绘制位图(而其他后端不直接提供此功能)。
要创建具有不同后端的位图,您只需将后端 class 作为参数传递,如下所示:
BigBitmap := TBitmap32.Create(TMemoryBackend)
或
BigBitmap := TBitmap32.Create(TGDIMemoryBackend)
最终你必须将你的图像保存在一个非可视化的内存位图中,而只是将可视化部分复制到屏幕上。这有点难看,但你不再依赖 GDI,这更难看,因为你永远不知道它是否适用于你客户的机器。