gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:46:16 29 4
gpt4 key购买 nike

这适用于在具有 32GB 内存的 64 位 Windows 8 系统上运行的 .NET 4.5 控制台应用程序。该应用程序针对 64 位平台并启用了 gcAllowVeryLargeObjects 标志,这允许应用程序创建大于 2Gb .NET 限制的对象。因此,我能够创建一个大至 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);

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

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

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

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

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

System.AccessViolationException: Attempted to read or write protected memory. Tis is often an indication that other memoryis corrupt. at MS.Wind32.PresentationCore.UnsafeNativeMethods.WICBitmapFrameEncode.WriteSource(SafeMILHandle THIS_PTR, SafeMILHandle pIBitmapSource, Int32Rect& r) at System.Windows.Media.Imaging.BitmapEncoder.Save(Stream stream)

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

最佳答案

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

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

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

关于c# - 如何将分辨率为 32767 x 32767 的 C# .NET WriteableBitmap 保存为 JPG 或 PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29186758/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com