powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
25 сообщений из 26, страница 1 из 2
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113288
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для png у них вроде есть свой юнит, но для jpg нету и работа TJpegImage или TPicture в потоке - это лотерея во время Bmp32.Assign(jpg/pic).

Кто решал эту проблему без TThread.Synchronize?
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113289
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

я бы через GDI+ или DX декодировал.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113295
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге воспользовался jpegdec.pas из synopse.

https://blog.synopse.info/?post/2010/03/14/Fast-JPEG-decoder-using-SSE/SSE2

Допилил только чуть-чуть для работы с TBitmap32.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function TJpegDecode.ToBitmap32(bmp: TBitmap32): boolean;
var BMI: TBitmapInfo;
    DC: HDC;
begin
  if bmp=nil then
    Exit(false);
  if bmp.Width<>width then
    bmp.Width := width;
  if bmp.Height<>height then
    bmp.Height := height;

  Move(pRGB^,Bmp.Bits^,Width*Height*4);
  Result:=True;
end;
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113296
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для PNG взял TPortableNetworkGraphic32.

Теперь не глючит в потоках.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113390
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat,

libjpeg-turbo же.
Правда, официальных дельфийских заголовков нет, есть модуль из статьи на Хабре и у меня примерно такой же (тоже под TFastDIB).
JpegDec от Synopse я когда-то пробовал, и вроде бы он не все jpeg-и открывает - впрочем, уже плохо помню.
Png у меня через GDI+, можно и jpeg через неё же, от libjpeg-turbo по скорости отстаёт, но не так сильно, как стандартный модуль.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113392
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Там небось dll надо с собой подтягивать?

А это решение этого не требует.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113401
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, но для меня dll не проблема.
Проверил - прогрессивные файлы JpegDec не грузит.
Битые (недокачанные) файлы тож, хотя это не всегда нужно, тем не менее GDI+ как правило показывает целую часть.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113402
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытался приложить прогрессивный файл для примера, но форум его пережал, так что он уже не прогрессивный. Ну найдёте пример самостоятельно.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113405
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не надо открывать "любые" jpeg. Только "обычные".
Конкретно растры географической подложки.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113406
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще КМК, progressive jpeg был актуален во времена dal-up и 2G интернета.

Нафига он нужен сейчас - вопрос.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113411
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну ладно, не нужен так не нужен.
Но и по скорости JpegDec рекордов не ставит, уступает даже GDI+ (на Win7). Возможно на XP со старой GDI+ будет наоборот, но где ж сейчас найдёшь эту XP.
То есть единственное достоинство - нет зависимости от внешних DLL. И то GdiPlus.dll уже скорее системная, а не внешняя.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113414
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потестировал ещё - нашёл 1 картинку, где JpegDec быстрее. Но на большинстве медленнее.
Разница там не 10 раз, конечно, как со стандартным модулем, а процентов 20-40.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113417
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

мы у себя вот эту либу юзаем:
https://www.simdesign.nl/nativejpg.html
полностью на делфе, в потоках тоже работает.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113421
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NativeJpg когда-то щупал - вроде была медленная, ближе к стандартному модулю по скорости.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113425
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Скорость примерно одинаковая. Зато фич больше, есть критичные для нас. Плюс более всеядная чем встроенная, она увы не всё далеко открывает.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113445
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Одинаковая со стандартным модулем - это медленно :) Хотя если больших картинок нет, то может и норм.
Собрал пример к NativeJpg, получилось чуть быстрее стандарта, 16 мп файл грузит 820 мс. Прочие методы см. картинку.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113469
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon
мы у себя вот эту либу юзаем

Я перепиливал NativeJpg под свои нужды. Самая медленная часть любого jpeg декодера - это непосредственно DCT преобразования. А поскольку NativeJpg хранит все MCU блоки в памяти, то DCT отлично распараллеливается, что собственно я и сделал. И теперь у меня скорость декодирования зависит от количества ядер. Не знаю, почему автор библиотеки это изначально не сделал.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113470
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aniskin,

Распараллеливать декодирование одного файла - это оверкилл.

Часто стоит задача одновременного декодирования многих файлов. Сколько же тогда потоков будет? :)
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113520
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aniskin,

о как! интересно. есть шанс расшарить? я то и сам, возможно найду концы, но дабы не заниматься велоспидостроительством...
можно лично, если не в паблик
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113542
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat
Распараллеливать декодирование одного файла - это оверкилл.

Зависит от решаемой задачи.

makhaon
есть шанс расшарить?

Дело в том, что от исходной библиотеки остались лишь процедуры FDCT/IDCT одного DU блока и процедуры перевода цветов из разных цветовых пространств, все остальное переделано/переписано. Поэтому мой код в чистом виде не поможет.

У меня была идея оформить все это в красивом виде и выложить на github, может быть когда-нибудь реализую.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113545
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А использовать Vampyre Imaging не пробовал?
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113549
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aniskin,

понял. хотя бы в каком модуле/месте копать скажи, дабы долго не рыться? сам может гляну.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113568
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon
хотя бы в каком модуле/месте копать скажи, дабы долго не рыться? сам может гляну.


Можешь начать с TsdJpegBlockCoder.SamplesToImage из sdJpegBlockCoder.pas. Есть цикл от 0 до FInfo.VertMcuCount - 1, его и надо распараллеливать.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113700
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat
Aniskin,
Распараллеливать декодирование одного файла - это оверкилл.
В некоторых случаях может быть полезно, типа картиночный вьюер должен грузить картинку как можно быстрее.
Мне попадалась многопоточная сишная библиотека, утверждается, что быстрее libjpeg-turbo:
https://t0rakka.silvrback.com/jpeg-decoding-benchmark
сейчас автор убрал её из открытого доступа, сохранилась только версия 2017-го года
https://github.com/galek/mango
Но пока у меня нет большой необходимости ещё ускорять jpeg, так что лень разбираться со сборкой сишных исходников.
...
Рейтинг: 0 / 0
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
    #40113701
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

В идеале вообще бы конвеер иметь. Что бы он сам распараллеливал нагрузку, будь то 1 jpeg или 10 за раз.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]