2009-06-19 3 views
6

Мне нужно обработать большие изображения (20,000x20,000pixels) на C#. Открытие этих изображений напрямую - это не выход из-за ограничений памяти, но то, что я хочу сделать, это разделить изображение на более мелкие части (обрезка). Я искал стороннюю библиотеку, которая могла бы обмануть, но пока ничего не получилось. Я попробовал FreeImage и ImageMagick, но они не могут открыть изображение размером 20 000x20x000 пикселей. Как я могу это достичь?Как обрезать огромное изображение

+1

В каком формате находится изображение? В таких форматах, как bitmap, вы можете просто использовать файл io напрямую. Если вы хотите использовать GDI или что-то еще, вы затем конвертируете отдельные куски в поток, а затем загружаете его в изображение). Форматы, такие как PNG, потребуют от вас глубже изучить, как PNG-файлы разбиваются на блоки и работают с ними напрямую. – Brian

ответ

3

Мой текущий проект на работе состоит из программы просмотра изображений/анализа, способной загружать изображения размером более 16 ГБ. Вы должны использовать ручной файл ввода-вывода, вывести информацию заголовка и создать свои субимазы по требованию (или если вы обрабатываете изображение, вы можете создать одну плиту и обработать ее на месте). Очень немногие библиотеки собираются предоставить вам возможность загружать/изменять изображение 20k на 20k (1.2gb при 24bpp), а те, которые делают это, редко делают это с чем-то похожим на производительность (если это вызывает беспокойство).

+0

16gb + изображения? Это потрясающе, откуда они взялись? –

+0

Мы работаем с радарными изображениями с синтезированной апертурой, которые могут генерировать очень большие изображения: P –

+0

hah, thats badass (у Google есть отличные изображения на этом), на каких языках вы используете.Мне любопытно, может ли C# справиться с такой нагрузкой –

0

Я не знаю ни одной существующей библиотеки, чтобы это сделать.

Возможно, вам придется взломать поток файлов изображений, найти место, где имеются данные о цвете и пикселе, и прочитать раздел данных о пикселях в массиве и создать свое изображение из этого.

Например, для BMP file format вы хотите искать в таблице цветов, загружать таблицу цветов, затем искать секцию массива пикселей, загружать сколько угодно пикселей в массив, а затем создавать новое растровое изображение с этими пикселями.

0

Я бы сделал это с ImageMagick. Существует довольно простой .NET API, и, как правило, это лучший способ обработки изображений.

Посмотрите на. NET, часть пути вниз по странице.

http://www.imagemagick.org/script/api.php

Вот информация о том, как урожай материал в ImageMagick работает, для версии командной строки.

http://www.imagemagick.org/Usage/crop/#crop

0

Вы можете использовать встроенный в .Net библиотеки.

Использование

sourceBitmap = (Bitmap)Image.FromStream(sourceFileStream, false, false);

Это остановит данные изображения из кэшируются в памяти. Вы можете создать новое растровое изображение назначения, чтобы сделать подраздел этого массивного изображения для:

var output = new Bitmap(outputWidth, outputHeight); 
var outputGraphics = Graphics.FromImage(output); 

outputGraphics.DrawImage(sourceBitmap, destRect, srcRect, GraphicsUnit.Pixel); 

using (var fs = File.OpenWrite(outputFilePath)) 
{ 
    output.Save(fs, System.Drawing.Imaging.ImageFormat.Png); 
} 

Где destRect может быть весь размер outputImage или меньшую площадь.

Смежные вопросы