Рассмотрите следующий файл:
-rw-r--r-- 1 user user 470886479 2009-12-15 08:26 the_known_universe.png
Как Вы уменьшили бы масштаб изображения до разумного разрешения, с помощью не больше, чем 4 ГБ RAM?
Например:
$ convert -scale 7666x3833 the_known_universe.png
Какая библиотека C обработала бы его?
Спасибо!
Я полагаю, что libpng имеет интерфейс потока. Я думаю, его можно использовать для чтения частей изображения за раз; в зависимости от файла изображения вы можете получить строки по порядку. Затем можно уменьшить каждую строку (например, для уменьшения на 50% уменьшить строку по горизонтали и отбросить каждую вторую строку) и записать в выходной файл.
Использование libpng в C может занять достаточно много кода, но документация довольно хорошо помогает в этом.
http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3.8
Вы можете использовать библиотеку обработки изображений, которая предназначена для выполнения сложных операций с большими (и маленькими) изображениями. Одним из примеров является набор инструментов для создания изображений IM . Он хорошо связывается с C (но хотя бы частично реализован на C ++) и имеет хорошую привязку к Lua. Из привязки Lua должно быть легко экспериментировать.
Несколько лет назад я использовал cximage. Я думаю, что последняя версия находится на http://www.xdp.it/cximage.htm после выхода из CodeProject.
Изменить: извините, это C ++, а не C.
Задумывались ли вы об изучении изображений на основе пирамид? Представьте себе пирамиду, в которой изображение разделено на несколько слоев, каждый из которых имеет разное разрешение. Каждый слой разбит на плитки. Таким образом, вы можете отображать уменьшенную версию изображения, а также увеличенный частичный вид изображения без необходимости повторного масштабирования.
См. запись в Википедии .
Одним из исходных форматов был FlashPix, для которого я написал средство визуализации. Я также создал новый формат конвертера и рендерера пирамид, который использовался в медицинских приложениях. Настоящий сканер будет производить сканирование более 90 ГБ среза органа для исследования рака. На самом деле алгоритм преобразователя был довольно непростым, чтобы получить эффективные изображения пирамид. Вы не поверите, но на самом деле он был основан на Java и работал намного лучше, чем вы думаете. Используется многопоточность. Бенчмаркинг показал, что вряд ли версия C будет работать намного лучше. Это было 6 лет назад. Первоначальный рендерер, который я создал более 10 лет назад. В наши дни вы больше ничего не слышите об изображениях, основанных на пирамидах. Но на самом деле это единственный эффективный способ создания масштабированных изображений по запросу без создания кешированных масштабированных версий.
Jpeg2000 может иметь или не иметь дополнительную функцию пирамиды.
Я напоминаю, что форматы и преобразования ImageMagick, возможно, включают FlashPix. Поиск в Google по запросу "пирамида изображений" дает некоторые интересные результаты. Верните немного воспоминаний; -)
Вы можете попробовать сделать 64-битную сборку ImageMagick или посмотреть, есть ли она. Мой коллега написал в блоге сверхпростой декодер png (предполагается, что у вас есть zlib или его эквивалент), чтобы вы могли увидеть код, который вам понадобится для создания собственного.
http://www.atalasoft.com/cs/blogs/stevehawley/archive/2010/02/23/libpng-you-re-doing-it-wrong.aspx
Вам нужно будет выполнить повторную выборку пока вы его читаете.
Если вы можете переместить его в 64-разрядную ОС, вы можете открыть его как файл, сопоставленный с памятью или эквивалент, и использовать практически любую библиотеку, которую вы хотите. Это не будет быстро, и может потребоваться увеличение файла страницы / подкачки (в зависимости от ОС и того, что еще вы хотите с ней сделать), но взамен вы не будете ограничены потоковыми библиотеками, поэтому вы сможете выполнять больше операций, прежде чем переходить к сокращению разрешения или нарезке.