Прозрачность в GeoTIFF
Работа над r2weather.ru идёт полным ходом, а значит появляются и исправляются различные баги. Один из последних и самых интересных - настройка прозрачности.
После того как я создал GeoTIFF и нарезал его на тайлы с помощью gdal2tiles у меня получился следующий результат:
Если присмотреться, то можно увидеть отдельные “выколотые” пикселы там, где находится море. А если взять ночную фотографию, то такие пикселы еще более заметны:
Это явно ошибка определения прозрачности, так как на оригинальном изображении этой проблемы нет.
Прозрачность
В GeoTIFF прозрачность можно задать несколькими способами. В одной из предыдущих статей я описал, как задать прозрачность на уровне каждого канала. Для этого нужно добавить следующий параметр:
<NoDataValue>0.0</NoDataValue>
Он фактически говорит, что все пикселы с нулевым значением в данном слое - прозрачны. Но это не всегда так! “0” или чёрный цвет - это не отсутствие цвета. Это такой цвет. В прозрачных png флаг, который определяет прозрачность - это альфа канал. Если значение 0x0, то пиксел полностью прозрачный. Если 0xFF, то - непрозрачный.
При работе с GeoTIFF этим можно воспользоваться. Для этого добавляется дополнительный слой, у которого тип Alpha:
<VRTRasterBand dataType="Byte" band="4">
<Description>Alpha</Description>
<ColorInterp>Alpha</ColorInterp>
<SimpleSource>
<SourceFilename relativeToVRT="1">output.png</SourceFilename>
<SourceBand>4</SourceBand>
</SimpleSource>
</VRTRasterBand>
В результате GeoTIFF будет содержать:
Band 4 Block=2438x1 Type=Byte, ColorInterp=Alpha
Description = Alpha
Программы, которые работают с GeoTIFF, могут использовать этот канал для того, чтобы задавать прозрачность.
Результат
После добавления прозрачности из альфа-канала, результат gdal2tiles выглядит следующим образом:
Над Латвией сейчас ночь.