#用到的库LibTiff
LibTiff.Net (bitmiracle.com)
# tiff格式介绍
TIFF图像文件格式详解整理_sqzeng的博客-CSDN博客_tiff格式
Tiff Tag Reference, Search page (awaresystems.be)
# 常用的tag
IMAGEWIDTH: 图片宽度
IMAGELENGTH: 图片高度
SAMPLESPERPIXEL: 一个像素的通道数量,一般就是rgb 3个通道
BITSPERSAMPLE: 每个通道的Bits数量
XRESOLUTION: x方向分辨率,正常的图片为72dpi, 印刷用图片300dpi
YRESOLUTION: y方向分辨率
RESOLUTIONUNIT: 分辨率单位,一般为英寸
PHOTOMETRIC: 色彩空间, 如rgb
COMPRESSION: 压缩类型, 如jpeg
ORIENTATION: 行和列从哪边开始,一般行从左向右,列从上往下,即:Left-Top
ROWSPERSTRIP: 每个条的行数,一般设为和IMAGELENGTH相同的值
STRIPBYTECOUNT: 当采用某种压缩方式后,每个条带内包含的字节数
# 保存
public static void SaveTiff(string path, Texture2D texture) { using (Tiff tiff = Tiff.Open(path, "w")) { var width = texture.width; var height = texture.height; tiff.SetField(TiffTag.IMAGEWIDTH, width); tiff.SetField(TiffTag.IMAGELENGTH, height); tiff.SetField(TiffTag.SAMPLESPERPIXEL, 3); tiff.SetField(TiffTag.BITSPERSAMPLE, 8, 8, 8); tiff.SetField(TiffTag.ORIENTATION, Orientation.TOPLEFT); tiff.SetField(TiffTag.ROWSPERSTRIP, height); tiff.SetField(TiffTag.XRESOLUTION, 72.0); tiff.SetField(TiffTag.YRESOLUTION, 72.0); tiff.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH); tiff.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); tiff.SetField(TiffTag.PHOTOMETRIC, Photometric.RGB); tiff.SetField(TiffTag.COMPRESSION, Compression.NONE); Color32[] colors = texture.GetPixels32(); byte[] scanline = new byte[3 * width]; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { Color32 color = colors[(height - row - 1) * width + col]; scanline[col * 3 + 0] = color.r; scanline[col * 3 + 1] = color.g; scanline[col * 3 + 2] = color.b; } tiff.WriteScanline(scanline, row); } } }
# 读取
public static void ReadTiff(string tiffPath) { using (Tiff tiff = Tiff.Open(tiffPath, "r")) { if (tiff == null) { Debug.LogErrorFormat("Invalid Tiff"); return; } var fields = tiff.GetField(TiffTag.ARTIST); var metadataBytes = fields[0].GetBytes(); string metadataString = System.Text.Encoding.UTF8.GetString(metadataBytes); Debug.Log($"export tiff meta json: {metadataString}"); int imageWidth = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); int imageHeight = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); var xResolution = tiff.GetField(TiffTag.XRESOLUTION)[0].ToInt(); var yResolution = tiff.GetField(TiffTag.YRESOLUTION)[0].ToInt(); Compression compression = (Compression)tiff.GetField(TiffTag.COMPRESSION)[0].ToShort(); } }
【其他参考】
java - 如何从TIFF图像数据创建TIFF文件 - Thinbug
libtiff中的tag标签含义 | 学步园 (xuebuyuan.com)
LIBTIFF - 随笔分类 - 一杯清酒邀明月 - 博客园 (cnblogs.com)
Using The TIFF Library (libtiff.org)
翻译一下libtiff的手册 - 一杯清酒邀明月 - 博客园 (cnblogs.com)