大部分像素类型为BYTE的影像,都是UNSIGNED BYTE,但也有一部分为SIGNEDBYTE
基本换算关系为:将UNSIGNEDBYTE影像中像素值减掉256即可以得到SIGNEDBYTE
但GDAL库中,只有小部分数据格式支持SIGNEDBYTE像素类型,比如
HFA(erdas img),
GTiff (tif),
ERS(ERMapper .ers)等
在影像读取时,可以根据波段统计值或波段元数据来判断是否为SIGNEDBYTE类型:
//获取影像的统计值,如果最小值小于0,那么表明这个影像是SignedByte double max, min, mean, stddev; ds.GetRasterBand(1).GetStatistics(1, 1, out min, out max, out mean, out stddev); if(min < 0)
//判断是否是SIGNEDBTYE型的波段 string[] meta = ds.GetRasterBand(1).GetMetadata("IMAGE_STRUCTURE"); bool signedByte = false; for (int i = 0; i < meta.Length; i++) { if (meta[i] == "PIXELTYPE=SIGNEDBYTE") { signedByte = true; break; } }
在创建新影像时,需要声明一下,创建的是SINGEDBYTE类型的影像,其中d为Driver,dsout为要创建的影像
if (signedByte) dsout = d.Create(this.cut_savePathBox.Text, width, height, bands.Length, DataType.GDT_Byte, new string[] { "PIXELTYPE=SIGNEDBYTE" }); else dsout = d.Create(this.cut_savePathBox.Text, width, height, bands.Length, DataType.GDT_Byte, null);