解析tiff生成为jpeg

起因

  在项目中,一直借助插件来展示tif/tiff图片,最近部署一个项目中,需要在iPad显示tif图,总体来说tif图展示的需求,不是很大.

解析tif图的两种方式

  1.使用libtiff(c/c++原生库,通过p/invoke调用),这种方式要求高,而且较耗时
  2.基于libtiff,.Net版本上手快,本次使用这种方式.

libtiff.net下载

  1.直接在nuget安装到项目中.
  使用LibTiff.Net是可以完全跨平台的,因为它有NetStandrand版本.

tif转jpeg代码

using System;
using System.IO;
using BitMiracle.LibTiff.Classic;

namespace TiffApp
{
    class Program
    {
        /// <summary>
        /// 测试解析tiff
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Converter cnv = new Converter();                           //来自Tiff2Rgba项目,直接复制而来
            cnv.m_compression = Compression.JPEG;

            string file = "1.TIF";
            string fileName = Path.GetFileNameWithoutExtension(file);  //获取文件名(去除扩展名)
            int count = 0;
            using (Tiff inImage = Tiff.Open(file, "r"))                //读取tif文件
            {
                if (inImage == null)
                    return;
                //获取tiff中的张数
                do
                {
                    count++;
                } while (inImage.ReadDirectory());
            }
            Console.WriteLine($"tif中的张数:{count}");
            //重新读取,不然保存的图片的顺序是相反
            using (Tiff inImage = Tiff.Open(file, "r"))
            {
                if (inImage == null)
                    return;
                for (int i = 0; i < count; i++)
                {
                    string newName = $"{fileName}_{i}.jpeg";          //保存jpeg文件的文件名称       
                    using (Tiff outImage = Tiff.Open(newName, "w"))   //保存jpge文件
                    {
                        do
                        {
                            if (!cnv.tiffcvt(inImage, outImage) || !outImage.WriteDirectory())
                                break;
                        } while (inImage.ReadDirectory());
                    }
                }
                Console.WriteLine("save ok");
            }
        }
    }
}

秋风 2017-04-11