Как мне создать изображение 256 мегапикселей в C #?

2

Я делаю приложение для обработки изображений. Мне нужно изображение размером 16000 x 16000 пикселей. Это невозможно, потому что в PhotoShop я могу создать это изображение для печати. (56 x 56 дюймов, в 300 dpi)

Я использую этот код:

Image WorkImage = new Bitmap(16000, 16000); 

Это генерирует исключение "Invalid Parameter", но не тогда, когда я делаю 9000 x 9000 пикселей.

MSDN ничего не говорит о границах в конструкторе.

Я знаю, что данные в растровом объекте находятся в памяти, потому что, если массив слишком велик, он может генерировать исключение "Out Of Memory", но это не так. Я бы предпочел управлять этими данными в файле, но я не знаю, как это сделать.

Спасибо.

  • 0
    Что происходит с 15000x15000 пикселей? 14000x14000? 10000x10000?
Теги:
image
bitmap

4 ответа

6

Photoshop не выделяет гигантские изображения в смежных частях памяти, как вы пытаетесь сделать. Есть некоторые ограничения памяти, с которыми я столкнулся при создании очень больших изображений.

Рассмотрите разделение изображений. Это обеспечивает лучшее управление памятью. Если вы отредактируете одно из ваших разделенных изображений, вам не придется обновлять все изображение.


В стороне, 16000 x 16000 с 4 байтами на пиксель составляет примерно гигабайт! Это огромный. Удачи!

4

Почему бы не создать кучу меньших растровых изображений? Например. 16 растровых изображений размером 4k x 4k пикселей...?

О, и хотя, вероятно, и не причина исключения, которое вы получили, есть некоторые смешные причуды с большими объектами/кучей больших объектов CLR. Это описано в некоторых других темах SO, которые вы можете читать просто для удовольствия, так как вы играете с большими кусками памяти... Например: Как вернуть неиспользуемую память из большой кусок объекта LOH из нескольких управляемых приложений?

  • 2
    Да, моя мысль точно.
  • 1
    Да, я не видел твой ответ, когда я отправил мой. Я думаю, мы нажали «Добавить ответ» примерно в одно и то же время ... :)
2

Пока я согласен с Чарли, что вы, вероятно, лучше с несколькими меньшими растровыми изображениями, я просто запустил код ниже на моей 32-битной Windows с 2 ГБ оперативной памяти, и потребовалось некоторое время, чтобы закончить, но я не получил никаких ошибок.

var b = new Bitmap(16000, 16000);
Console.WriteLine("size is {0}x{1}", b.Width, b.Height);
  • 0
    Спасибо, Брайан! Я не видел каких-либо непосредственных технических причин в CLR, почему он потерпит неудачу, и теперь я знаю. :)
0

Действительно, не помните, где находятся данные битмапа. Мне нужен только выходной файл (TIFF) с изображением 16000 x 16000 пикселей. Я думаю, что я могу создать класс (как класс bitmap и класс изображения), но и данные в самом файле, где я могу редактировать изображение.

Я собираюсь проверить структуру TIFF и создать класс для создания и редактирования тех файлов, которые частично буферизованы в памяти. Я не хочу создавать объект размером более нескольких МБ.

Но я хочу знать, есть ли какой-нибудь класс с возможностью редактирования файлов BMP или TIFF... действительно, я не знаю.

Спасибо за ваши предыдущие ответы.:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню