【问题标题】:How do I create a 256 megapixels image in C#?如何在 C# 中创建 256 兆像素的图像?
【发布时间】:2009-08-14 04:50:39
【问题描述】:

我正在制作一个成像应用程序。我需要一个 16000 x 16000 像素的图像。这并非不可能,因为在 PhotoShop 中我可以创建此图像进行打印。 (56 x 56 英寸,300dpi)

我正在使用此代码:

Image WorkImage = new Bitmap(16000, 16000); 

这会产生 "Invalid Parameter" 异常,但在我使用 9000 x 9000 像素时不会。

MSDN 没有说明构造函数中的限制。

我知道位图对象中的数据在内存中,因为如果数组太大会抛出"Out Of Memory" 异常,但事实并非如此。我更喜欢在文件中管理这些数据,但我不知道如何。

谢谢。

【问题讨论】:

  • 15000x15000 像素会发生什么? 14000x14000? 10000x10000?

标签: c# image bitmap


【解决方案1】:

Photoshop 不会像您尝试那样在内存的连续部分中分配巨大的图像。在创建非常大的图像时,我遇到了一些内存限制。

考虑细分您的图像。这具有更好的内存管理的好处。如果您编辑其中一张细分图像,则无需更新整个图像。


顺便说一句,每像素 4 字节的 16000 x 16000 大约是 1 GB!这是巨大的。祝你好运!

【讨论】:

    【解决方案2】:

    为什么不生成一堆更小的位图呢?例如。 16 个 4k x 4k 像素的位图...?

    哦,虽然可能不是您遇到异常的原因,但大对象/CLR 大对象堆有一些有趣的怪癖。这包含在其他一些 SO 主题中,您可能想阅读这些主题只是为了好玩,因为您正在使用大量内存......例如:How to get unused memory back from the large object heap LOH from multiple managed apps?

    【讨论】:

    • 是的,我发帖时没有看到您的回复。我想我们几乎同时点击了“添加答案”...... :)
    【解决方案3】:

    虽然我同意 Charlie 的观点,您可能最好使用几个较小的位图,但我只是在具有 2 GB RAM 的 32 位 Windows 上运行了下面的代码,它需要一段时间才能完成,但我没有收到任何错误。

    var b = new Bitmap(16000, 16000);
    Console.WriteLine("size is {0}x{1}", b.Width, b.Height);
    

    【讨论】:

    • 谢谢布赖恩!我没有在 CLR 中看到任何直接的技术原因导致它失败,现在我知道了。 :)
    【解决方案4】:

    真的,不要介意位图数据在哪里。我只需要在输出中包含 16000 x 16000 像素图像的文件 (TIFF)。我认为我可以创建一个类(位图类和图像类如何),但使用文件本身中的数据,我可以在其中编辑图像。

    我正在考虑检查 TIFF 结构并创建一个类来创建和编辑那些部分缓冲在内存中的文件。我不想创建一个大于几 MB 的对象。

    但我想知道是否有一些具有 BMP 或 TIFF 文件编辑功能的类...我真的不知道。

    感谢您之前的回答。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多