我正在制作成像应用程序。我需要一个16000 x 16000像素的图像。这并非不可能,因为在PhotoShop中我可以创建此图像进行打印。 (56 x 56英寸,300dpi)
我正在使用此代码:
Image WorkImage = new Bitmap(16000, 16000);
这会产生"Invalid Parameter"
例外,但不会产生9000 x 9000像素。
MSDN没有说明构造函数中的限制。
我知道位图对象中的数据在内存中,因为如果数组太大,可能会抛出"Out Of Memory"
异常,但事实并非如此。我宁愿在一个文件中管理这些数据,但我不知道如何。
感谢。
答案 0 :(得分:6)
Photoshop不会像您尝试的那样在内存的连续部分中分配巨大的图像。我在创建非常大的图像时遇到了一些内存限制。
考虑细分图像。这有利于更好的内存管理。如果您编辑其中一个细分图像,则无需更新整个图像。
另外,每像素4字节的16000 x 16000大约是1 GB!这是巨大。祝你好运!
答案 1 :(得分:4)
为什么不生成一堆较小的位图?例如。 16位图像是4k x 4k像素......?
哦,虽然可能不是你得到的异常的原因,但是有一些有趣的怪癖与大对象/ CLR大对象堆。这是一些其他SO主题的内容,您可能只是为了好玩而阅读,因为您正在玩大块内存......例如:How to get unused memory back from the large object heap LOH from multiple managed apps?
答案 2 :(得分:2)
虽然我同意Charlie的说法,你可能最好使用几个较小的位图,我只是在我的32位Windows上使用2 GB RAM运行下面的代码,并且需要一段时间才能完成,但我没有收到任何错误。
var b = new Bitmap(16000, 16000);
Console.WriteLine("size is {0}x{1}", b.Width, b.Height);
答案 3 :(得分:0)
真的,不要介意位图数据在哪里。我只需要在输出中使用16000 x 16000像素图像的文件(TIFF)。我认为我可以创建一个类(如何使用位图类和图像类),但是使用文件本身的数据,我可以在其中编辑图像。
我正在考虑检查TIFF结构并创建一个类来创建和编辑部分缓冲在内存中的文件。我不想创建一个比几MB大的对象。
但我想知道是否有一些具有BMP或TIFF文件编辑功能的课程...我真的不知道。
感谢您之前的答案。 :)