Closed ioctl-user closed 2 years ago
Уточнение. В write_geoimg.cpp , write_geoimg() есть такая строка:
if (opts.get<bool>("skip_empty") && res == GObj::FILL_NONE) return;
Однако, она работает только при отрисовке плиток самых первых листов, так как перед этим стоит загрузка изображения из существующего файла и, соответственно, невыполнению условия.
В итоге заведомо ненужные плитки считываются и потом перезаписываются.
Смысл параметра skip_empty такой: Объект GObj, который что-то рисует на картинке, может вернуть GObj::FILL_NONE, если он ничего не нарисовал. В этом случае файл не сохраняется.
Действительно, если есть параметр --add и существует файл, то он будет зря прочитан (но не записан). Надо подумать, как это можно оптимизировать. Можно, наверное, рисовать на отдельную картинку, а потом, если что-то было нарисовано, то подгрузить старую и перенести все на нее. Но как-то это криво. Еще, наверное, можно в интерфейс GObj добавить отдельную функцию проверки "будет ли что-нибудь нарисовано на данной картинке".
Форматы без сжатия, конечно, имеет смысл добавить. Попробую это сделать.
Формат pnm или pam, кстати, подойдет?
Добавил параметр --tiff_compression для указания алгоритма сжатия при записи TIFF-файлов:
При использовании сжания jpeg при записи tiff-файлов используется параметр --jpeg_quality, так же, как и при записи jpeg-файлов. Интересно, что jpeg-сжатие в tiff сохраняет прозрачность.
https://github.com/slazav/mapsoft2-libs/commit/33a0845811c3d697f6887eaa5838d6e32a0cf659
А про оптимизацию --skip_epmty, наверное, лучше сделать отдельный баг. Хотя красивого решения я пока не вижу.
Сейчас все выходный форматы файлов изображений подразумевают сжатие с потерями или без.
При отрисовке плиток один и тот же файл читается и пишется каждый раз, когда обрабатывается один лист карты, а их несколько десятков. В итоге получаются большие накладные расходы на пересжатие png.
Можно добавить какой-то условный bmp с альфа-каналом, или убрать сжатие в tiff?