Как обрезать огромное изображение - PullRequest
6 голосов
/ 19 июня 2009

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

Ответы [ 5 ]

3 голосов
/ 19 июня 2009

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

1 голос
/ 19 июня 2009

Не знаю, поможет ли это, но вот статья о обработке изображений с помощью C # лямбда-выражений .

0 голосов
/ 22 ноября 2017

Вы можете использовать встроенные библиотеки .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 или меньшей областью.

0 голосов
/ 06 декабря 2012

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

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

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

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

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

0 голосов
/ 05 декабря 2012

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

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

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

...