As imagens do Sentinel 2 L1C começaram como 12 bits, mas isso foi alterado no início de 2016 quando o ESA mudou o QUANTIFICATION_VALUE de 1000 para 10000. Agora o L1C é codificado como um UINT16
arquivo jp2 com (pelo menos?) 15 bits significativos. Isto é de gdalinfo
um B02.jp2
arquivo recente :
Band 1 Block=1024x1024 Type=UInt16, ColorInterp=Gray
Overviews: 5490x5490, 2745x2745, 1372x1372, 686x686
Overviews: arbitrary
Image Structure Metadata:
COMPRESSION=JPEG2000
NBITS=15
Levando isso em consideração, o limite parece ser 32767 em vez de 65535. Qualquer leitor JPEG2000 retornará o valor da amostra como dois bytes; portanto, qualquer código que espere uma imagem de 16 bits estará seguro, mesmo que o NBITS mude para 16 no futuro.
Outra observação - o produto metadata.xml que vem com todos os blocos L1C contém informações sobre os valores especiais NO_DATA e SATURATED, que em produtos recentes são assim:
<Special_Values>
<SPECIAL_VALUE_TEXT>NODATA</SPECIAL_VALUE_TEXT
<SPECIAL_VALUE_INDEX>0</SPECIAL_VALUE_INDEX>
</Special_Values>
<Special_Values>
<SPECIAL_VALUE_TEXT>SATURATED</SPECIAL_VALUE_TEXT
<SPECIAL_VALUE_INDEX>65535</SPECIAL_VALUE_INDEX>
</Special_Values>
O valor SATURATED de 65535 indica que a intenção era realmente usar toda a gama de uint16.
Quanto a L2A, se o algoritmo corrigiu idealmente todas as reflexões especulares, registro incorreto do DEM, radiação emitida e outras causas de refletância acima de 100%, você deve obter uma saída na faixa de 0..10000. Como nenhuma correção atmosférica é ideal, é possível esperar que alguns valores estejam fora desse intervalo, provavelmente até 65534, com 65535 novamente reservado para pixels SATURADOS.