SASGIS

Веб-картография и навигация

Сжатие PNG-тайлов при сохранении в кэш (без потерь)

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модератор: Tolik

Сжатие PNG-тайлов при сохранении в кэш (без потерь)

Сообщение VadimK60 » 18 авг 2021, 17:53

Подскажите, пожалуйста!

Есть ли в программе возможность оптимизировать только что скачанные с сайта тайлы в формате PNG, и только потом сохранять их в кэш ?
Под "оптимизировать" я понимаю уменьшение размера PNG-тайла без потери качества и без потери прозрачности + сравнение размеров файлов до и после оптимизации + сохранение в кэш файла меньшего размера.

Случайно на глаза попалась спецификация, в которой сказано, что PNG бывают разные. С палитрой и без.
По идее, первый вариант с палитрой предпочтительнее для хранения тайлов: размер небольшой, цветов обычно мало (всяко меньше 256).

Полез смотреть, в каком формате хранятся PNG-тайлы в моей коллекции кэшей.
И был очень удивлён тем, что в основном используется более громоздкий вариант БЕЗ палитры (RGBA). :(

Провёл несколько экспериментов.

Кэш Garmin QuickDraw.
Folders: 2138
Files : 12569
ДО оптимизации: Files size = 214 314 515 bytes
ПОСЛЕ оптимизации: Files size = 64 170 441 bytes
разница в размерах в 3,3 раза !!!

Кэш Navionics Sonarchart.
Folders: 1725
Files : 79907
ДО оптимизации: Files size = 288 878 769 bytes
ПОСЛЕ оптимизации: Files size = 178 467 237 bytes
разница в размерах в 1,6 раза

Кэш osmMap Mapnik.
Folders: 1161
Files : 83757
ДО оптимизации: Files size = 349 138 359 bytes
ПОСЛЕ оптимизации: Files size = 328 840 482 bytes
разница в размерах в 1,1 раза (чувствуется рука профессионального сообщества :D )


Как видно, разница довольно внушительная!
Особенно для тех, кто делает карты для мобильных приложений (в форматах mbtiles,sqlite3 и др, в которых PNG упаковывается как есть без доп. преобразований).

Поискал на сайте. Просьба оптимизировать PNG уже встречается среди хотелок: http://www.sasgis.org/mantis/view.php?id=2394
Но там речь идёт о манипуляциях с уже скачанными файлами.

Есть ли возможность включить оптимизацию именно на этапе закачки ?
Вложения
!optimize_PNG.rar
использовавшийся комплект утилит для оптимизации PNG-файлов в папке и всех её подпапках
(228.33 KiB) Скачиваний: 169
VadimK60
Новичок
 
Сообщения: 25
Зарегистрирован: 24 окт 2018, 23:18
Благодарил (а): 6 раз.
Поблагодарили: 4 раз.

Re: Сжатие PNG-тайлов при сохранении в кэш (без потерь)

Сообщение Tolik » 19 авг 2021, 11:55

Думаю, вам надо открыть такую хотелку.

За это сообщение автора Tolik поблагодарил:
VadimK60 (19 авг 2021, 15:40)
Рейтинг: 5.26%
 
Tolik
Гуру
 
Сообщения: 2604
Зарегистрирован: 28 янв 2011, 10:38
Благодарил (а): 280 раз.
Поблагодарили: 587 раз.

Re: Сжатие PNG-тайлов при сохранении в кэш (без потерь)

Сообщение VadimK60 » 19 авг 2021, 15:40

VadimK60
Новичок
 
Сообщения: 25
Зарегистрирован: 24 окт 2018, 23:18
Благодарил (а): 6 раз.
Поблагодарили: 4 раз.

Re: Сжатие PNG-тайлов при сохранении в кэш (без потерь)

Сообщение VadimK60 » 23 авг 2021, 00:47

Для поддержания разговора в Хотелке пришлось собрать статистику по перепаковке имеющихся у меня кэшей с PNG-тайлами. :)
Пережимал 2 программами. Сказать, что одна однозначно лучше другой, наверное, нельзя.
До и после "перекодировки" замерялось количество файлов, их общий размер, высчитывался объём диска, которое они занимали бы при разных размерах кластера (512,1024,2048,4096 байт на кластер). Далее в таблицах обозначение 1 байт на кластер использовалось для указания реального размера ).

В итоговую таблицу свёл соотношения размеров (для разных размеров кластера) ДО пережатия к соответствующим размерам ПОСЛЕ пережатия.
В последнем столбце указано соотношение ДО при размере кластера 4096 к размеру ПОСЛЕ при размере кластера 512, которое показывает максимально возможную выгоду от одновременного ужатия PNG тайлов и перехода к минимальному размеру кластера.

Код: Выделить всё
------------------------------------------------------------------------------------
Map Name:               Compressor:                      Cluster size:
                                       real=1   512    1024    2048    4096    combo*
------------------      -----------    ------   ---    ----    ----    ----    -----
GarminQuickDraw         PNGnq          3,3      3,2     3,1     3       2,7     3.6
                        optiPNG -o2    2,1      2,1     2,1     2,0     1,8     2,4

DesnogorskQD            optiPNG -o7    2,2      2,2     2,1     2,1     2       2.3

rosreestr_cadastr       optiPNG -o2    2,2      2,2     2       1,9     2       2,7
                        optiPNG -o7    2,2      2,2     2       1,9     2       2,7

navionics               optiPNG -o2    2,5      2,3     2,0     2,0     1,0     2.6

navionics_sonarchart    PNGnq          1,6      1,6     1,6     1,4     1,1     1,9
                        optiPNG -o7    2,4      2,2     2,0     2,0     1,1     2,6

osmmapMapnik            PNGnq          1,1      1,1     1,1     1       1       1,5
                        optiPNG -o7    1,1      1,1     1,1     1       1       1,6

yahyb                   PNGnq          1,6      1,5     1,3     1,2     1,1     4,7
                        optiPNG -o2    2,2      1,6     1,4     1,2     1,1     4,9
                        optiPNG -o7    2,2      1,6     1,4     1,2     1,1     4,9
                                       -----   -----------------------------
                                      (alloc size before /alloc size after)
-------------------------------------------------------------------------------------
*combo: alloc4096before/alloc512after

Link to PngNQ   converter: https://sourceforge.net/projects/pngnq/
Link to OptiPNG converter: https://sourceforge.net/projects/optipng/
OptiPNG с ключём -o7 перебирает гораздо больше параметров, чем с ключём -o2 (по-умолчанию)

скрытый текст: показать
Код: Выделить всё
DesnogorskQD QuickDraw:
=======================
Before:
-------
Total files: 23998

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    631009149 ; 616219 ; 601 << Total files size
_512:    637190656 ; 622256 ; 607
1024:    643379200 ; 628300 ; 613
2048:    655575040 ; 640210 ; 625
4096:    680288256 ; 664344 ; 648

After (optiPNG -o7):
------------------
Total files: 23998

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    288721119 ; 281954 ; 275 << Total files size
_512:    294878720 ; 287967 ; 281
1024:    300977152 ; 293923 ; 287
2048:    313325568 ; 305982 ; 298
4096:    340307968 ; 332332 ; 324

   1: 601/275=2,2
_512: 607/281=2,2
1024: 613/287=2,1
2048: 625/298=2,1
4096: 648/324=2
combo (alloc4096before/alloc512after): 648/281=2,3

GarminQuickDraw
===============
Before:
-------
Total files: 12569

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    214314515 ; 209291 ; 204 << Total files size
_512:    217511936 ; 212414 ; 207
1024:    220747776 ; 215574 ; 210
2048:    226981888 ; 221662 ; 216
4096:    239898624 ; 234276 ; 228

After (PNGnq):
------------------
Total files: 12569

Cluster       Allocated size:
size:       bytes      Kb   Mb
   1:    64170441 ; 62666 ; 61 << Total files size
_512:    67403776 ; 65824 ; 64
1024:    70429696 ; 68779 ; 67
2048:    75571200 ; 73800 ; 72
4096:    90517504 ; 88396 ; 86

   1: 204/61=3,3
_512: 207/64=3,2
1024: 210/67=3,1
2048: 216/72=3
4096: 228/86=2,7
combo (alloc4096before/alloc512after): 228/64=3,6

After (optiPNG -o2):
------------------
Total files: 12569

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:     99434428 ;  97103 ;  94 << Total files size
_512:    102639616 ; 100234 ;  97
1024:    105713664 ; 103236 ; 100
2048:    113098752 ; 110448 ; 107
4096:    130908160 ; 127840 ; 124

   1: 204/94=2,1
_512: 207/97=2,1
1024: 210/100=2,1
2048: 216/107=2,0
4096: 228/124=1,8
combo (alloc4096before/alloc512after): 228/97=2,4

navionics
=========
Before:
-------
Total files: 122888

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    400678629 ; 391287 ; 382 << Total files size
_512:    448474624 ; 437963 ; 427
1024:    501102592 ; 489358 ; 477
2048:    515743744 ; 503656 ; 491
4096:    525123584 ; 512816 ; 500

After (optiPNG -o2):
------------------
Total files: 122888

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    160575013 ; 156811 ; 153 << Total files size
_512:    198287872 ; 193640 ; 189
1024:    255764480 ; 249770 ; 243
2048:    258719744 ; 252656 ; 246
4096:    504242176 ; 492424 ; 480

   1: 382/153=2,5
_512: 427/189=2,3
1024: 477/243=2,0
2048: 491/246=2,0
4096: 500/480=1,0 ???
combo (alloc4096before/alloc512after): 500/189=2,6

navionics_sonarchart
====================
Before:
-------
Total files: 79907

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    288878769 ; 282108 ; 275 << Total files size
_512:    316612096 ; 309191 ; 301
1024:    347219968 ; 339082 ; 331
2048:    357005312 ; 348638 ; 340
4096:    377815040 ; 368960 ; 360

After (PNGnq):
------------------
Total files: 79360

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    178467237 ; 174284 ; 170 << Total files size
_512:    197362176 ; 192736 ; 188
1024:    216884224 ; 211801 ; 206
2048:    261826560 ; 255690 ; 249
4096:    329297920 ; 321580 ; 314

   1: 275/170=1,6
_512: 301/188=1,6
1024: 331/206=1,6
2048: 340/249=1,4
4096: 360/314=1,1
combo (alloc4096before/alloc512after): 360/188=1,9

After (optiPNG -o7):
------------------
Total files: 79907

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    122038382 ; 119178 ; 116 << Total files size
_512:    144592896 ; 141204 ; 137
1024:    175456256 ; 171344 ; 167
2048:    182859776 ; 178574 ; 174
4096:    330002432 ; 322268 ; 314

   1: 275/116=2,4
_512: 301/137=2,2
1024: 331/167=2,0
2048: 340/174=2,0
4096: 360/314=1,1
combo (alloc4096before/alloc512after): 360/137=2,6

osmmapMapnik
============
Before:
-------
Total files: 83757

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    349138359 ; 340955 ; 332 << Total files size
_512:    372732928 ; 363997 ; 355
1024:    398173184 ; 388841 ; 379
2048:    449294336 ; 438764 ; 428
4096:    545959936 ; 533164 ; 520

After (PNGnq):
------------------
Total files: 83757

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    328840482 ; 321133 ; 313 << Total files size
_512:    352491520 ; 344230 ; 336
1024:    377929728 ; 369072 ; 360
2048:    429086720 ; 419030 ; 409
4096:    526589952 ; 514248 ; 502

   1: 332/313=1,1
_512: 355/336=1,1
1024: 379/360=1,1
2048: 428/409=1
4096: 520/502=1
combo (alloc4096before/alloc512after): 520/336=1,5

After (optiPNG -o7):
------------------
Total files: 83757

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    321945211 ; 314399 ; 307 << Total files size
_512:    344740352 ; 336660 ; 328
1024:    369269760 ; 360615 ; 352
2048:    419313664 ; 409486 ; 399
4096:    522502144 ; 510256 ; 498

   1: 332/307=1,1
_512: 355/328=1,1
1024: 379/352=1,1
2048: 428/399=1,1
4096: 520/498=1
combo (alloc4096before/alloc512after): 520/328=1,6

rosreestr_cadastr
=================
Before:
-------
Total files: 20162

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:    164831949 ; 160968 ; 157 << Total files size
_512:    169985536 ; 166001 ; 162
1024:    174464000 ; 170375 ; 166
2048:    185937920 ; 181580 ; 177
4096:    213053440 ; 208060 ; 203

After (optiPNG -o2):
------------------
Total files: 20162

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:     73712524 ;  71984 ;  70 << Total files size
_512:     79564800 ;  77700 ;  75
1024:     85978112 ;  83963 ;  81
2048:     99569664 ;  97236 ;  94
4096:    109301760 ; 106740 ; 104

   1: 157/70=2,2
_512: 162/75=2,2
1024: 166/81=2
2048: 177/94=1,9 - ???
4096: 203/104=2
combo (alloc4096before/alloc512after): 203/75=2,7

After (optiPNG -o7):
------------------
Total files: 20162

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:     73710042 ;  71982 ;  70 << Total files size
_512:     79562752 ;  77698 ;  75
1024:     85974016 ;  83959 ;  81
2048:     99565568 ;  97232 ;  94
4096:    109293568 ; 106732 ; 104

   1: 157/70=2,2
_512: 162/75=2,2
1024: 166/81=2
2048: 177/94=1,9 - ???
4096: 203/104=2
combo (alloc4096before/alloc512after): 203/75=2,7

yahyb
=====
Before:
-------
Total files: 70776

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:     93565832 ;  91372 ;  89 << Total files size
_512:    107303936 ; 104789 ; 102
1024:    139609088 ; 136337 ; 133
2048:    204236800 ; 199450 ; 194
4096:    334721024 ; 326876 ; 319

After (PNGnq):
------------------
Total files: 70776

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:     57815401 ;  56460 ;  55 << Total files size
_512:     71550976 ;  69874 ;  68
1024:    103973888 ; 101537 ;  99
2048:    169820160 ; 165840 ; 161
4096:    298225664 ; 291236 ; 284

   1:  89/55=1,6
_512: 102/68=1,5
1024: 133/99=1,3
2048: 194/161=1,2
4096: 319/284=1,1
combo (alloc4096before/alloc512after): 319/68=4,7 !!!

After (optiPNG -o2):
------------------
Total files: 70776

Cluster       Allocated size:
size:        bytes       Kb    Mb
   1:     43066470 ;  42057 ;  41 << Total files size
_512:     68900864 ;  67286 ;  65
1024:    100706304 ;  98346 ;  96
2048:    167897088 ; 163962 ; 160
4096:    308387840 ; 301160 ; 294 ???

   1:  89/41=2,2
_512: 102/65=1,6
1024: 133/96=1,4
2048: 194/160=1,2
4096: 319/294=1,1
combo (alloc4096before/alloc512after): 319/65=4,9 !!!

After (optiPNG -o7):
------------------
Total files          : 70776

Cluster     Allocated size:
size:     bytes       Kb    Mb
   1:  43048257 ;  42039 ;  41 << Total files size
_512:  68879360 ;  67265 ;  65
1024: 100684800 ;  98325 ;  96
2048: 167882752 ; 163948 ; 160
4096: 308375552 ; 301148 ; 294


   1:  89/41=2,2
_512: 102/65=1,6
1024: 133/96=1,4
2048: 194/160=1,2
4096: 319/294=1,1
combo (alloc4096before/alloc512after): 319/65=4,9 !!!


Конкретно по картам можно сказать следующее:

  • есть карты которые плохо сжимаются сами по себе (OSMmap Mapnik); игра с размером кластера ничего не меняет.
  • карты Garmin QuickDraw показали хорошую сжимаемость, даже при увеличении размера кластера разница хорошо заметна.
  • карта navionics_sonarchart , на смотря на хорошую сжимаемость, при размере кластера 4К после сжатия заняла на диске практически столько же места, сколько и ДО :(
  • удивила карта yahyb: как и предыдущая карта, при размере кластера = 4К сжимать её оказалось невыгодно; НО зато после одновременного сжатия и уменьшения размера кластера объём занятого ею места на диске уменьшается почти в 5 раз !!!

Понятно, что ради базы данных никто не будет переформатировать диск с меньшим размером кластера. Win 10, кстати позволяет при форматировании задать размер кластера NTFS диска от 512 байт.
Вся надежда на хранение мелких тайлов в базах данных. :)
Вложения
!optimize-PNG.rar
OptiPNG - гибкий оптимизатор всех файлов PNG в папке и подкаталогах.
(96.6 KiB) Скачиваний: 137
VadimK60
Новичок
 
Сообщения: 25
Зарегистрирован: 24 окт 2018, 23:18
Благодарил (а): 6 раз.
Поблагодарили: 4 раз.

Re: Сжатие PNG-тайлов при сохранении в кэш (без потерь)

Сообщение Tolik » 23 авг 2021, 18:34

Конечно, надо хранить в БД. Формат по умолчанию SQLite3.
Tolik
Гуру
 
Сообщения: 2604
Зарегистрирован: 28 янв 2011, 10:38
Благодарил (а): 280 раз.
Поблагодарили: 587 раз.

Re: Сжатие PNG-тайлов при сохранении в кэш (без потерь)

Сообщение Tolik » 23 авг 2021, 18:38

А с каким числом цветов вы игрались? ИМХО, 256 - идеальный вариант.
Tolik
Гуру
 
Сообщения: 2604
Зарегистрирован: 28 янв 2011, 10:38
Благодарил (а): 280 раз.
Поблагодарили: 587 раз.

Re: Сжатие PNG-тайлов при сохранении в кэш (без потерь)

Сообщение VadimK60 » 29 авг 2021, 05:02

Если цветов в изображении меньше 256-ти, то оптимизатор добавляют палитру и конвертит файл из 24-х битного в 8-ми битный.
Если цветов меньше 16, то файл перегоняется в 4-х битный с палитрой.

Очень неплохая экономия получается на последнем этапе, если оптимизатор укорачивает палитру.
Т.е. сохраняет не все 256 (или 16 для 4-х битного) цветов в палитре, а только те, что реально используются.
В итоге экономится по 3 байта с каждой урезанной из палитры позиции (цвета).
OptiPNG умеет укорачивать палитру. PngNQ, похоже, нет.

Ещё имеют значения использовавшиеся при сжатии фильтры. Точнее, для изображений с палитрой фильтр использовать вообще не нужно. Любой фильтр, отличный от None :) , только увеличивает размер итогового файла.

Кстати, структуру PNG-файла удобно изучать при помощи TweakPNG, в том числе рассматривать, из скольки же цветов состоит палитра файла.
VadimK60
Новичок
 
Сообщения: 25
Зарегистрирован: 24 окт 2018, 23:18
Благодарил (а): 6 раз.
Поблагодарили: 4 раз.


Вернуться в SAS.Планета

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

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