Скорость чтения графических форматов

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 04.02.2013 12:22:20

alexey38 писал(а):Я для себя сишную матричную математику так прикручивал к паскалю.

Вот этого мой пытливый ум = тоже понять не хочет. Рассудите сами:
Есть: процессор, мат плата, ОС и они одинаковые что для С++, что для Pascal.
Машинные коды - также абсолютно одинаковые и даже asm - один: и для С++, и для Pascal.
Но все говорят что С++ лучше и быстрее Pascal - вот как это получается при вышеприведённых условиях?
На мой взгляд - если такое торможение действительно есть, то это ошибка программистов Pascal...

Парсер, для изображений?
Это действительно интересная вещь, если найти, что в изображениях можно парсить?
Там есть только номер цвета и координаты точки.
Оптимизировать алгоритмы чтения и изменения размера - можно, а что и как там парсить?
Я это спрашиваю т.к. у меня наверно иное понимание - понятия парсить.



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение debi12345 » 04.02.2013 13:18:02

Оптимизировать алгоритмы чтения и изменения размера - можно, а что и как там парсить?

Кстати, задача нетривиальная. Я сегодня перепробовал несколь распространенных ресайзеров и фамбнэйлгенераторов - они максимум в 2 раза быстрее чем FPimage. То есть на оптимизации алгоритмов не выедешь. И XNView их всех делает в 50..100 раз. Разберемся !
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Скорость чтения графических форматов

Сообщение Sergei I. Gorelkin » 04.02.2013 14:55:34

XnView кеширует по крайней мере одно полное изображение. Убедиться можно так: в папке с несколькими изображениями открываем одно из них в XnView, потом его же удаляем с помощью explorer'a. В XnView нажимаем PgUp - PgDn, т.е. переходим на следующее изображение и обратно. Покажет только что удаленную картинку. Один раз, потом до нее доходит и при повторном нажатии PgUp - PgDn больше не показывает.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Скорость чтения графических форматов

Сообщение alexey38 » 04.02.2013 15:34:28

vitaly_l писал(а):Вот этого мой пытливый ум = тоже понять не хочет. Рассудите сами:
Есть: процессор, мат плата, ОС и они одинаковые что для С++, что для Pascal.
Машинные коды - также абсолютно одинаковые и даже asm - один: и для С++, и для Pascal.
Но все говорят что С++ лучше и быстрее Pascal - вот как это получается при вышеприведённых условиях?
На мой взгляд - если такое торможение действительно есть, то это ошибка программистов Pascal...

Паскаль отличный язык и на нем можно написать что угодно, в т.ч. быстрые алгоритмы. Но чтобы написать быстрый алгоритм, Вам нужно вначале разобраться в самом алгоритме, а затем его оптимальным образом закодировать на языке программирования. Если алгоритм сложный то нужно изучать всякую там теорию. На написание такого алгоритмы может потребоваться 1-2 года жизни. Если Вы не торопитесь, то можете написать на паскале то, что Вам нужно.

Но когда мне нужно было решить конкретную задачу на матричной алгебре для комплексных числах, то я написал свой вариант, но он оказался медленным. Поискал и нашел готовые математические библиотеки именно на С++, которые меня устроили по скорости работы. На изучение алгоритма мне бы потребовалось несколько месяцев, которых у меня не было. Я за 1 день сделал на С++ библиотеку DLL, и через день уже имел законченный продукт.

Добавлено спустя 6 минут 24 секунды:
vitaly_l писал(а):Парсер, для изображений?
Это действительно интересная вещь, если найти, что в изображениях можно парсить?
Там есть только номер цвета и координаты точки.
Оптимизировать алгоритмы чтения и изменения размера - можно, а что и как там парсить?
Я это спрашиваю т.к. у меня наверно иное понимание - понятия парсить.

Есть формат графических файлов, называемый BMP - там последовательно перечисляются без всякого сжатия цвета каждой точки. С этим форматом все очень просто. И именно с этим форматом и работает ОС, когда выводит TImage.
Но помимо простых форматов, есть сложные форматы. Один из самых сложных - это JPEG, для начала можно прочитать краткие сведения http://ru.wikipedia.org/wiki/JPEG. Чтобы из бинарного файла с расширением jpg получить матрицу цветов точек нужно совершить большое количество арифметических и логических операций. Можно сделать чтение в максимально возможном качестве, а можно убыстрить чтение с ухудшением качества. Для этого всего и нужно писать алгоритмы, и эти алгоритмы не самые простые. Вы можете потретить какое-то время и написать на паскале самую быструю в мире библиотеку чтения jpeg, но можете найти готовую библиотеку, если готовая будет не на паскале, то просто примените DLL, и используйте ее.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 04.02.2013 17:19:06

Sergei I. Gorelkin писал(а):XnView кеширует по крайней мере одно полное изображение

Согласен, но чтобы сделать кэш - вначале нужно прочитать изображение и вот здесь торможение.
(а с повторным показом - проблем нет).
alexey38 писал(а):за 1 день сделал на С++ библиотеку DLL, и через день уже имел законченный продукт.

Это очень мудрое и правильное решение - глупо изобретать велосипед, за исключением редких случаев самой математики, но у Вас такой задачи не стояло.
alexey38 писал(а):Для этого всего и нужно писать алгоритмы, и эти алгоритмы не самые простые. Вы можете потретить какое-то время и написать на паскале самую быструю в мире библиотеку чтения jpeg, но можете найти готовую библиотеку, если готовая будет не на паскале, то просто примените DLL, и используйте ее.
Никто и не спорит, я как раз прошу такой компонент, т.к. уверен что, его уже написали для Лазарус, просто мы не знаем об этом, а возможно есть кто-то, кто сталкивался и знает.

Если кто слышал или использовал: компонент - позволяющий быстро считывать и масштабировать изображения - пожалуйста отзовитесь или оставьте гиперссылочку. :cry:



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение alexey38 » 04.02.2013 19:42:52

vitaly_l писал(а):Никто и не спорит, я как раз прошу такой компонент, т.к. уверен что, его уже написали для Лазарус, просто мы не знаем об этом, а возможно есть кто-то, кто сталкивался и знает.

Можно конечно просто ждать, но предлагаю Вам одновременно поискать библиотеки и компоненты на любых языках программирования. Может найдете такую, которая есть, например, для Дельфи, а там ее перевести - это без проблем. То есть Вы здесь ждите реакцию, но и одновременно ищите в инете по форумам и т.п.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Скорость чтения графических форматов

Сообщение debi12345 » 04.02.2013 19:49:59

0.3 .. 0.5 сек на конверсию одной 2000х1000 JPEG-картинки (P4 2.4 GHz 512M RAM) в 48х48-превьюшку:

1) http://www.graphicsmagick.org/GraphicsMagick.html:

Код: Выделить всё
for %%f in (*.jpg) do gm convert %%f -thumbnail 48x48 -gravity center .\rsz\gm_%%f


1) ffmpeg (libswscale) :

Код: Выделить всё
# for %%f in (*.jpg) do ffmpeg.exe -i %%f -vf scale=-1:48 .\rsz\t_%%f 2>null


то есть далеко не реал-тайм. Нужно подробно исследовать исходники XNView (если таковые доступны)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Скорость чтения графических форматов

Сообщение Kemet » 04.02.2013 20:05:07

2vitaly_l,
если нужны превьюшки, в плане понимания работы, то можно погуглить на тему Delphi Thumbnail
и посмотреть готовые примеры
например
здесь
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 04.02.2013 20:53:48

Kemet писал(а):и посмотреть готовые примеры
например здесь

СПАСИБО - добрый Kemet - это то что нужно, т.к. превращает картинки в 3-7 раз быстрее чем у меня и скорость вполне приемлема...
правда только для JPEG... но думаю я разберусь как это буржуины делают так быстро scale... ещё раз спасибо.


.
debi12345 писал(а):http://www.graphicsmagick.org/GraphicsMagick.html:

Спасибо добрый debi12345, но мне очень не хочется пользоваться внешними утилитами. Хотя это тоже безусловно решение.

alexey38 писал(а):поискать библиотеки и компоненты на любых языках программирования

я честно искал, но у меня не получается искать, правда я ищу на наших сайтах и нашёл лишь несколько примеров загрузки JPEG/


:arrow: Всем спасибо, тема остается актуальной, т.к. пригодиться - многим. :cry:


/
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение debi12345 » 04.02.2013 21:45:21

но мне очень не хочется пользоваться внешними утилитами. Хотя это тоже безусловно решение.

Эти утиллиты - просто урапперы к мощным С-ным DLL (экзешки я использовал для оценки быстродействия). Так что если другого мультиформатного решения не найдется, то можно использовать эти DLL.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Скорость чтения графических форматов

Сообщение amateur » 04.02.2013 23:31:08

1. Деби: мсе - вери найс. Но похож на удобную кровать без матраса (лазарь - красивая кровать и "полудохлый" матрас). Сугубо мое личное мнение.

2 vitaly_l, сам не тестил, но посмотрите Graphics32. Может поможет но не очень уверен (лазарь - смотрите выше). Кажись он ужо портирован под лазарь.
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 05.02.2013 13:22:49

Суть в следующем: абсолютно все предложенные компоненты - читают изображения через единого родителя TPicture,
и там судя по всему априори заложен медленный алгоритм чтения. Читают они все через TStream. Соответственно это
TStream скорее всего тормозит не только загрузку графики но и загрузку всего что использует TStream. <== это предположение.

1) Я попробовал искать компонент который самостоятельно инициализирует графику но пока не нашёл :cry: ?
2) Это нужно как-то объяснить тем кто Лазарус готовит, т.к. они быстро разберутся: Что там тормозит загрузку файлов?
проверяется очень просто, берётся предложенный Kemet пример на http://rmklever.com/?tag=thumbnails и там
хорошо видно как например 100 изображений 2000х2000 - загружаются меньше секунды, но разработчик того компонента,
тоже использует единого родителя TPicture, соответственно при переносе на Лазарус чтение 100 изображений 2000х2000 - затягивается почти на минуту.
Вот как это победить?

:!: :arrow: Если кто знает компонент, который сам(без TPicture) - читает различные форматы, дайте ссылочку прлииииииз.... :cry:



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение alexey38 » 05.02.2013 14:16:16

vitaly_l писал(а):TStream скорее всего тормозит не только загрузку графики но и загрузку всего что использует TStream. <== это предположение.

Сделайте пример. Создайте класс TFileStream и загрузите файл с картинкой. Замерьте время, думаю, что будет очень быстро. Я уверен, что тормозит алгоритм декодирования бинарного файла в изображение.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Скорость чтения графических форматов

Сообщение debi12345 » 05.02.2013 14:17:32

Так где тормоза :

1) распаковка сжатого файла в битмап + загрузка битмапа в TImage (TImageList) + масштабирвание на канвасе вниз для превью + отрисовка
2) перкордировка сжатого файла в умеьшенный сжатый файл под превью + распаковка уменьшенного файла в маленький битмап + загрузка маленькго битмапа в TImage (TImageList) + отрисовка
3) перкордировка сжатого файла в уменшенный битмап + загрузка маленького битмапа в TImage (TImageList) + отрисовка

? Что дают Ваши эксперименты ?

Из того что я проверил, перекодировка не может быть быстрой кроме как используя спецфишки форматов (выборка боле егрубых блоков,..) - но не на каждый формат сразу найдешь такой алгоритм.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 05.02.2013 14:39:44

alexey38 писал(а):Создайте класс TFileStream и загрузите файл с картинкой.

проверю. (я пока проверял только загрузку TPicture: открыл/закрыл и всё... - без вывода на экран и масштабирования)
99% времени тратится именно на загрузку файлов - масштабирование и т.д. - происходит моментально.

debi12345 писал(а): перекодировка не может быть быстрой кроме как

У других же она быстрая <-- значит может быть быстрой?
И пока ещё рано говорить, что виновата перекодировка, т.к. это не подтверждено.



/
Последний раз редактировалось vitaly_l 05.02.2013 15:00:17, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 240

Рейтинг@Mail.ru