LINUX.ORG.RU

Какой библиотекой на С++ быстрее всего генерируются картинки?


0

1

Есть некоторая функция, задающая цвет точки картики от ее координаты. Какой библиотекой лучше всего воспользоваться для создания картинки на диске? Формат не очень приципиален, лучше всего png но не суть.

для картинки 800x800 у меня на ноуте - ImageMagick (2 сек) - libpng (1.4 сек)

И то и то как то ооочень долго;-(

★★★★★

libgd (есть функции работы с разными форматами), а так - быстрее всего самому.

Eddy_Em ☆☆☆☆☆
()

> Есть некоторая функция, задающая цвет точки картики от ее координаты.

Может быть проблема в этой функции, а не в записи готового изображения на диск в каком-то формате? Что профайлер показывает?

kamre ★★★
()
Ответ на: комментарий от xcreatepixmap

Мне существенной зависимости скорости от степени сжатия найти не удалось.

Насчет самому быстрее всего - может и так.... только непонятно, нафик тогда такое количество библиотек написано?;-)))) Уж наверняка кто то эту проблему порешал...

libgd посмотрю, спасибо.

Меня что убило - гружу в PIL изображение из строки (одноцветный квадрат правда, но не суть, судя по размеру файла ему это пофик), вызываю метод show - генерация картинки на диске и ее отображение занимает сотые доли секунды! Я могу только предположить (охреневая), что поскольку у libpng данные устроены криво (массив массивов) оно их и пишет по строкам и потому так тормозит. Но ведь есть где то библиотеки под C, которые суют данные на диск одним куском? Или я с libpng че то не то творю...

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

От того, что libpng использует двойной массив, тормозить не может. Колв-во строк у относительно вменяемого файла (допустим, 50-60к) слишком мало. Может указан слишком маленький размер буфера для внутренней обработки потока, нужно ещё курить мануал.

mikki
()
Ответ на: комментарий от Eddy_Em

Мысль с профилировкой была на редкость удачной;-)

В общем из 1.4 сек секунда (!!!!) уходит на тупое копирование данных с вычислением цвета точки;-(((( Ускорить ето боюсь никак, кусок и так вылизан до блеска и скрипа.

Ну а дальше 0.4 сек запись png. Форматы без сжатия (типа bmp) пишуться влет (сотые доли секунды), это я уже через PIL пробовал...

Ну что ж, будем оптимизировать неоптимизируемое. Всем огромное спасибо за участие!

ЗЫ если кто то все же посдкажет более шуструю библиотеку, будет здорово.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

В общем из 1.4 сек секунда (!!!!) уходит на тупое копирование данных с вычислением цвета точки;-(((( Ускорить ето боюсь никак, кусок и так вылизан до блеска и скрипа.

Показывай код.

Deleted
()
Ответ на: комментарий от AIv

1.4 сек секунда (!!!!) уходит на тупое копирование данных

o_O

У меня Фурье изображения 800х600 за ~40мс вычисляется, вейвлет 1-го порядка - за ~150мс...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

На самом деле опция -O3 (отключенная на время отладки) секунду превращает в 0.08 сек;-)))

Если хочется посмотреть код - http://a-iv.ru/aivlib src/mk???.cpp ф-я interpolate в include/arrayTD.hpp Компромисс между скоростью и гибкостью, че ж делать...

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

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

А pixbuf что такое, не из той же серии?

Мне тоже надо картинки - что лучше не пойму; pil или pixbuf?На глаз по скорости одинаково - а точно как измерить?

anonymous
()
Ответ на: комментарий от mclaudt

Питон тормознее (на три порядка) когда чего то крутишь в интерпретаторе. Когда дергаешь из из питона большие С-шные функции, все тоже летает. + из под PIL сохраняешься в любой актуальный формат, не надо потом convert дергать.

Едиственное чего - приходиться лишний промежуточный буфер заводить. Сначала создаешь в питоне строку нужной длины, потом напускаешь на нее функцию отрисовки, потом эту строку суешь в PIL-овское изображение. Расточительство.... конечно по сравнению с сохранением на диск это все фигня, но хотелось бы сразу в память PIL-овского изображения нарисовать. Никто случаем не в курсе как это сделать? У него есть метод getim() возвращающий вроде как «pointer to internal image memory» но что это за мемори я не понял... пытаешься в нее писать - вылетает сегфолт. Не хочется исходники ковырять...

AIv ★★★★★
() автор топика

Уф... всем еще раз спасибо, тема закрыта. Резюме:

Из чистых C++ использую libpng - пишет долго но хорошо жмет. Все равно трехкратное ускорением по сравнению с ImageMagick + не надо возить кучу лишних библиотек;-)

Если есть Python - однозначно PythonImageLibrary. МЕтод Image.getim() возвращает пойнтер на struct ImagingMemoryInstance определенную в /usr/iclude/python/Imaging.h, в этой структуре есть буфер куда можно неспоредственно ручками загнать изображение из C++ а дальше через PIL делать с ним что угодно.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

>Из чистых C++ использую libpng

чистых C++

Бля...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.