Прозрачность в 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 выглядит следующим образом:

Над Латвией сейчас ночь.