Я делаю приложение для обработки изображений. Мне нужно изображение размером 16000 x 16000 пикселей. Это невозможно, потому что в PhotoShop я могу создать это изображение для печати. (56 x 56 дюймов, в 300 dpi)
Я использую этот код:
Image WorkImage = new Bitmap(16000, 16000);
Это генерирует исключение "Invalid Parameter"
, но не тогда, когда я делаю 9000 x 9000 пикселей.
MSDN ничего не говорит о границах в конструкторе.
Я знаю, что данные в растровом объекте находятся в памяти, потому что, если массив слишком велик, он может генерировать исключение "Out Of Memory"
, но это не так. Я бы предпочел управлять этими данными в файле, но я не знаю, как это сделать.
Спасибо.
Photoshop не выделяет гигантские изображения в смежных частях памяти, как вы пытаетесь сделать. Есть некоторые ограничения памяти, с которыми я столкнулся при создании очень больших изображений.
Рассмотрите разделение изображений. Это обеспечивает лучшее управление памятью. Если вы отредактируете одно из ваших разделенных изображений, вам не придется обновлять все изображение.
В стороне, 16000 x 16000 с 4 байтами на пиксель составляет примерно гигабайт! Это огромный. Удачи!
Почему бы не создать кучу меньших растровых изображений? Например. 16 растровых изображений размером 4k x 4k пикселей...?
О, и хотя, вероятно, и не причина исключения, которое вы получили, есть некоторые смешные причуды с большими объектами/кучей больших объектов CLR. Это описано в некоторых других темах SO, которые вы можете читать просто для удовольствия, так как вы играете с большими кусками памяти... Например: Как вернуть неиспользуемую память из большой кусок объекта LOH из нескольких управляемых приложений?
Пока я согласен с Чарли, что вы, вероятно, лучше с несколькими меньшими растровыми изображениями, я просто запустил код ниже на моей 32-битной Windows с 2 ГБ оперативной памяти, и потребовалось некоторое время, чтобы закончить, но я не получил никаких ошибок.
var b = new Bitmap(16000, 16000);
Console.WriteLine("size is {0}x{1}", b.Width, b.Height);
Действительно, не помните, где находятся данные битмапа. Мне нужен только выходной файл (TIFF) с изображением 16000 x 16000 пикселей. Я думаю, что я могу создать класс (как класс bitmap и класс изображения), но и данные в самом файле, где я могу редактировать изображение.
Я собираюсь проверить структуру TIFF и создать класс для создания и редактирования тех файлов, которые частично буферизованы в памяти. Я не хочу создавать объект размером более нескольких МБ.
Но я хочу знать, есть ли какой-нибудь класс с возможностью редактирования файлов BMP или TIFF... действительно, я не знаю.
Спасибо за ваши предыдущие ответы.:)