如何将分辨率为 32767 x 32767 的 C# .NET WriteableBitmap 保存为 JPG 或 PNG

Seo*_*Yoo 5 .net c# jpeg bitmap writeablebitmap

这是针对在具有 32GB 内存的 64 位 Windows 8 系统上运行的 .NET 4.5 控制台应用程序。该应用程序面向 64 位平台,并启用了 gcAllowVeryLargeObjects 标志,这允许应用程序创建大于 .NET 2Gb 限制的对象。因此,我能够创建一个最大 15GB 的整数数组。

我使用以下构造函数创建一个 32,767 x 32,767 像素的 System.Windows.Media.Imaging.WriteableBitmap,它使用 WIC(Windows 成像组件而不是 GDI+,因为 WIC 可以处理比 GDI+ 更高的分辨率)

WriteableBitmap wbit = new WriteableBitmap(32767, 32767, 300, 300, PixelFormats.Bgra32, null);
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码将其另存为 JPG

using (FileStream stream = new FileStream("c:\\test.jpg",FileMode.Create))
{
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(wbit));
encoder.Save(stream);
}
Run Code Online (Sandbox Code Playgroud)

我还尝试使用以下代码将其另存为 PNG

using (FileStream stream = new FileStream("c:\\test.png",FileMode.Create))
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(wbit));
encoder.Save(stream);
}
Run Code Online (Sandbox Code Playgroud)

对于 JPG 和 PNG,我可以将分辨率提高到 23,170 x 23,170,并且工作正常,但是提高到 23,171 x 23,171 会引发以下异常

System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。在MS.Wind32.PresentationCore.UnsafeNativeMethods.WICBitmapFrameEncode.WriteSource(SafeMILHandle THIS_PTR,SafeMILHandle pIBitmapSource,Int32Rect&r)在System.Windows.Media.Imaging.BitmapEncoder.Save(流流)

有谁知道此异常的原因,以及如何解决它,以便我可以将完整的最大分辨率保存为 32,767 x 32,767?也许我必须使用另一个编码器,甚至开始寻找 .NET 框架之外的东西。理想情况下,我希望能够处理 JPEG 最大分辨率为 65,535 x 65,535 的图像,甚至更高的 PNG 分辨率为 100,000 x 100,000 像素。我将不胜感激任何有关此事的帮助或朝着正确方向提出的建议。谢谢。

LEA*_*ort -1

您对 JPEG 格式本身支持更高分辨率的看法是正确的。我使用尺寸为 40,000 x 33,000 像素的巨大 JPEG 图像进行测试。使用 System.Drawing.Bitmap 无法加载 JPEG,但使用至少 2 个不同的程序可以正确打开:

\n\n
    \n
  1. Windows 7 照片查看器,可能是因为它使用 WIC,而不是 GDI+。
  2. \n
  3. IrfanView 64 位,但在加载期间将其大小调整为半宽和半高\n。
  4. \n
\n\n

这表明测试 JPEG 图像确实有效,即使 GDI+ 无法加载它。\n由于这不是 JPEG 规范的限制,因此它一定是 Microsoft\xe2\x80\x99s 实现中的限制。\xe2\x80\x99 不太可能有\xe2\x80\x99 的编码器解决方法。如果您必须具有更高的分辨率(并且您已表示这样做),那么最好的解决方案可能是找到不同的库来进行编码。

\n