|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Для png у них вроде есть свой юнит, но для jpg нету и работа TJpegImage или TPicture в потоке - это лотерея во время Bmp32.Assign(jpg/pic). Кто решал эту проблему без TThread.Synchronize? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 01:52 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
rgreat, я бы через GDI+ или DX декодировал. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 02:03 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
В итоге воспользовался 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 04:33 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Для PNG взял TPortableNetworkGraphic32. Теперь не глючит в потоках. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 04:37 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
rgreat, libjpeg-turbo же. Правда, официальных дельфийских заголовков нет, есть модуль из статьи на Хабре и у меня примерно такой же (тоже под TFastDIB). JpegDec от Synopse я когда-то пробовал, и вроде бы он не все jpeg-и открывает - впрочем, уже плохо помню. Png у меня через GDI+, можно и jpeg через неё же, от libjpeg-turbo по скорости отстаёт, но не так сильно, как стандартный модуль. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 19:26 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Sapersky, Там небось dll надо с собой подтягивать? А это решение этого не требует. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 19:29 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Да, но для меня dll не проблема. Проверил - прогрессивные файлы JpegDec не грузит. Битые (недокачанные) файлы тож, хотя это не всегда нужно, тем не менее GDI+ как правило показывает целую часть. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 19:44 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Пытался приложить прогрессивный файл для примера, но форум его пережал, так что он уже не прогрессивный. Ну найдёте пример самостоятельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 19:47 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Мне не надо открывать "любые" jpeg. Только "обычные". Конкретно растры географической подложки. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 20:06 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Вообще КМК, progressive jpeg был актуален во времена dal-up и 2G интернета. Нафига он нужен сейчас - вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 20:08 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Ну ладно, не нужен так не нужен. Но и по скорости JpegDec рекордов не ставит, уступает даже GDI+ (на Win7). Возможно на XP со старой GDI+ будет наоборот, но где ж сейчас найдёшь эту XP. То есть единственное достоинство - нет зависимости от внешних DLL. И то GdiPlus.dll уже скорее системная, а не внешняя. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 20:34 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Потестировал ещё - нашёл 1 картинку, где JpegDec быстрее. Но на большинстве медленнее. Разница там не 10 раз, конечно, как со стандартным модулем, а процентов 20-40. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 20:47 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
rgreat, мы у себя вот эту либу юзаем: https://www.simdesign.nl/nativejpg.html полностью на делфе, в потоках тоже работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 20:49 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
NativeJpg когда-то щупал - вроде была медленная, ближе к стандартному модулю по скорости. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 21:20 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Sapersky, Скорость примерно одинаковая. Зато фич больше, есть критичные для нас. Плюс более всеядная чем встроенная, она увы не всё далеко открывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 21:30 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Одинаковая со стандартным модулем - это медленно :) Хотя если больших картинок нет, то может и норм. Собрал пример к NativeJpg, получилось чуть быстрее стандарта, 16 мп файл грузит 820 мс. Прочие методы см. картинку. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2021, 22:16 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
makhaon мы у себя вот эту либу юзаем Я перепиливал NativeJpg под свои нужды. Самая медленная часть любого jpeg декодера - это непосредственно DCT преобразования. А поскольку NativeJpg хранит все MCU блоки в памяти, то DCT отлично распараллеливается, что собственно я и сделал. И теперь у меня скорость декодирования зависит от количества ядер. Не знаю, почему автор библиотеки это изначально не сделал. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2021, 06:23 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Aniskin, Распараллеливать декодирование одного файла - это оверкилл. Часто стоит задача одновременного декодирования многих файлов. Сколько же тогда потоков будет? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2021, 06:28 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Aniskin, о как! интересно. есть шанс расшарить? я то и сам, возможно найду концы, но дабы не заниматься велоспидостроительством... можно лично, если не в паблик ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2021, 13:40 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
rgreat Распараллеливать декодирование одного файла - это оверкилл. Зависит от решаемой задачи. makhaon есть шанс расшарить? Дело в том, что от исходной библиотеки остались лишь процедуры FDCT/IDCT одного DU блока и процедуры перевода цветов из разных цветовых пространств, все остальное переделано/переписано. Поэтому мой код в чистом виде не поможет. У меня была идея оформить все это в красивом виде и выложить на github, может быть когда-нибудь реализую. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2021, 16:10 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
А использовать Vampyre Imaging не пробовал? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2021, 16:29 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
Aniskin, понял. хотя бы в каком модуле/месте копать скажи, дабы долго не рыться? сам может гляну. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2021, 16:43 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
makhaon хотя бы в каком модуле/месте копать скажи, дабы долго не рыться? сам может гляну. Можешь начать с TsdJpegBlockCoder.SamplesToImage из sdJpegBlockCoder.pas. Есть цикл от 0 до FInfo.VertMcuCount - 1, его и надо распараллеливать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2021, 17:48 |
|
Как загрузить jpeg в Graphics32.TBitmap32 потокобезопасно?
|
|||
---|---|---|---|
#18+
rgreat Aniskin, Распараллеливать декодирование одного файла - это оверкилл. Мне попадалась многопоточная сишная библиотека, утверждается, что быстрее libjpeg-turbo: https://t0rakka.silvrback.com/jpeg-decoding-benchmark сейчас автор убрал её из открытого доступа, сохранилась только версия 2017-го года https://github.com/galek/mango Но пока у меня нет большой необходимости ещё ускорять jpeg, так что лень разбираться со сборкой сишных исходников. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2021, 12:02 |
|
|
start [/forum/topic.php?fid=58&msg=40113295&tid=2036854]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 159ms |
0 / 0 |