Вопрос по image, c# – Как обрезать огромное изображение

6

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

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

Ваш Ответ

5   ответов
0

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

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

3

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
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 или меньшей областью.

0

API, и, как правило, это лучший способ для обработки изображений.

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

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

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

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

Похожие вопросы