我有一个(不寻常的大)PNG,图像大小为 29000x29000 像素,wxWidgets 内部图像处理程序无法加载它。
我所看到的:
在文件 src\png\png.c 函数 png_check_IHDR() 中,有多项检查图像大小的功能,例如
if (width > PNG_UINT_31_MAX)
...
if (height > PNG_UINT_31_MAX)
...
其中 PNG_UINT_31_MAX 是 2147483647,因此比我的 29000 大得多,例如
if (width > png_ptr->user_width_max)
...
if (height > png_ptr->user_height_max)
...
其中 user_width_max/user_height_max 为 1000000,因此也比我的 29000 像素大得多。
但是后来函数wxImage::Create()无法分配所需的内存,调用
M_IMGDATA->m_data = (unsigned char *) malloc( width*height*3 );
不会返回已分配的内存。因此,尽管之前进行了尺寸检查,但图像尺寸似乎太大了。
当其他图片查看器/编辑器正确加载此图像时:是否有解决此问题的方法?可能在任何较新版本的 wxWidgets 中(我正在运行 v 3.1.4,但无法轻松更新它只是为了一个简单的测试......)?
谢谢!
更新:这是对 malloc( width * height * 3 ) 的调用。通常,29000290003 是 2523000000,但是当跳转到 malloc() 时,传递的大小要大得多。所以我当前的解决方案是在这里进行一些转换:
malloc( ((size_t)width)*((size_t)height)*((size_t)3) )
无论如何,这是一个已知的 wxWidgets/Windows/VisualStudio 问题吗?
为这样的图像分配内存大约需要 2.5GiB,因此在这种情况下内存分配很可能会失败(如果您使用 32 位操作系统,则几乎可以保证)。
如果您确实有足够的内存并使用 64 位构建,它应该会成功,但将此类图像完全加载到内存中可能仍然是一个坏主意。我不知道你打算用它做什么,但几乎肯定有更好的方法。