Какая библиотека C позволяет масштабировать огромные изображения? - PullRequest
8 голосов
/ 20 июля 2010

Рассмотрим следующий файл:

-rw-r--r-- 1 user user 470886479 2009-12-15 08:26 the_known_universe.png

Как бы вы масштабировали изображение до разумного разрешения, используя не более 4 ГБ ОЗУ?

Например:

$ convert -scale 7666x3833 the_known_universe.png

Какая библиотека C справится с этим?

Спасибо!

Ответы [ 7 ]

4 голосов
/ 20 июля 2010

Я полагаю, что libpng имеет потоковый интерфейс. Я думаю, что это может быть использовано для чтения частей изображения одновременно; в зависимости от файла изображения вы можете привести строки в порядок. Затем вы можете уменьшить каждую строку (например, для сокращения на 50%, уменьшить линию горизонтально и отбросить каждую вторую строку) и записать в выходной файл.

Использование libpng в C может занять значительное количество кода, но документация поможет вам в этом.

http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3.8

1 голос
/ 19 февраля 2018

libvips удобно с огромными изображениями.Это библиотека обработки потокового изображения, поэтому она может читать из источника, обрабатывать и записывать в место назначения одновременно и параллельно.Обычно он в 3–5 раз быстрее, чем imagemagick, и требует очень мало памяти.

Например, с самым большим PNG, который у меня есть на моем ноутбуке (1,8 ГБ), я могу уменьшить его в 10 раз с помощью:

$ vipsheader huge.png
huge.png: 72000x72000 uchar, 3 bands, srgb, pngload
$ ls -l huge.png 
-rw-r--r-- 1 john john 1785845477 Feb 19 09:39 huge.png
$ time vips resize huge.png x.png 0.1
real    1m35.279s
user    1m49.178s
sys 0m1.208s
peak RES 230mb

Не быстро, но и не слишком потертый.PNG - довольно медленный формат, он будет намного быстрее с TIFF.

libvips устанавливается большинством менеджеров пакетов (например, homebrew на macOS, apt на Debian), есть бинарный файл Windows и это бесплатно (LGPL).Помимо командной строки, существуют привязки для C, C ++, Python, Ruby, Lua, node, PHP и других.

1 голос
/ 20 июля 2010

Вы можете использовать библиотеку обработки изображений, которая предназначена для выполнения сложных операций с большими (и маленькими) изображениями.Одним из примеров является инструментарий обработки изображений .Он хорошо связан с C (но реализован хотя бы частично в C ++) и имеет хорошую привязку к Lua.С привязкой Lua должно быть легко экспериментировать.

1 голос
/ 20 июля 2010

Я использовал cximage несколько лет назад.Я думаю, что последняя версия находится в http://www.xdp.it/cximage.htm после удаления CodeProject.

Редактировать: извините, это C ++, а не C.

1 голос
/ 20 июля 2010

Вы можете попробовать сделать 64-битную сборку ImageMagick или посмотреть, есть ли она. Мой коллега написал блог со сверхпростым png-декодером (предполагается, что у вас zlib или эквивалентный), чтобы вы могли увидеть код, который вам понадобится, чтобы свернуть свой собственный.

http://www.atalasoft.com/cs/blogs/stevehawley/archive/2010/02/23/libpng-you-re-doing-it-wrong.aspx

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

0 голосов
/ 08 августа 2010

Если вы можете переместить его в 64-битную ОС, вы можете открыть его как файл с отображением памяти или эквивалентный файл и использовать практически любую нужную вам библиотеку. Это не будет быстро, и может потребоваться увеличение файла page / swap (в зависимости от ОС и того, что еще вы хотите с ним делать), но в свою очередь вы не будете ограничены потоковыми библиотеками, поэтому вы будете возможность выполнить больше операций, прежде чем перейти к уменьшению разрешения или нарезке.

0 голосов
/ 20 июля 2010

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

См. Запись в Википедии .

Одним из оригинальных форматов был FlashPix, для которого я написал средство визуализации. Я также создал новый формат конвертера и рендера пирамид, который использовался для медицинского применения. Настоящий сканер будет производить сканирование более 90 ГБ фрагмента органа для исследования рака. Алгоритм преобразователя был на самом деле довольно сложным, чтобы добиться эффективности, чтобы эффективно создавать изображения пирамиды. Хотите верьте, хотите нет, но на самом деле он был основан на Java и работал намного лучше, чем вы думаете. Он использовал многопоточность. Сравнительный анализ показал, что маловероятно, что C-версия будет работать намного лучше. Это было 6иш лет назад. Первоначальный рендерер я сделал более 10 лет назад. Вы больше ничего не слышите об изображениях на основе пирамид в наши дни. Но это действительно единственный эффективный способ создания масштабированных изображений по требованию без необходимости создания кэшированных масштабированных версий.

Jpeg2000 может иметь или не иметь дополнительную функцию пирамиды.

Напоминаю, что форматы поддержки и преобразования ImageMagick, возможно, включают FlashPix. Погуглив для «имиджевой пирамиды», можно найти некоторые интересные результаты. Верните немного воспоминаний; -)

...