tiff格式图片的读写

#用到的库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)

翻译一下libtiff的手册 - 一杯清酒邀明月 - 博客园 (cnblogs.com)

Using The TIFF Library (libtiff.org)

tiff和geotiff格式分析 - wenglabs - 博客园 (cnblogs.com)

TIFF文件格式详解_砖头不离身_新浪博客 (sina.com.cn)

TIFF图像文件格式详解整理_sqzeng的博客-CSDN博客_tiff标准

TIFF图像文件详解_谦言万语的博客-CSDN博客

posted @ 2022-05-02 00:11  yanghui01  阅读(688)  评论(0编辑  收藏  举报