Tif文件合并类

using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;

namespace Common
{
    /// <summary>
    /// Title Tif文件合并类
    /// Author:ward
    /// </summary>
    public class Tiff
    {
        /// <summary>  
        /// 获取图像页数  
        /// </summary>  
        /// <param name="imagePath"></param>  
        /// <returns></returns>  
        public static int GetPageNumber(string imagePath)
        {
            using (Image image = Bitmap.FromFile(imagePath))
            {
                Guid objGuid = image.FrameDimensionsList[0];
                FrameDimension objDimension = new FrameDimension(objGuid);

                return image.GetFrameCount(objDimension);
            }
        }

        /// <summary>  
        /// 将给定的文件 拼接输出到指定的tif文件路径  
        /// </summary>  
        /// <param name="imageFiles">文件路径列表</param>  
        /// <param name="outFile">拼接后保存的 tif文件路径</param>  
        /// <param name="compressEncoder">压缩方式,建议CompressionCCITT4</param>  
        public static void JoinTiffImages(ArrayList imageFiles, string outFile, EncoderValue compressEncoder)
        {
            //如果只有一个文件,直接复制到目标  
            if (imageFiles.Count == 1)
            {
                File.Copy((string)imageFiles[0], outFile, true);
                return;
            }

            Encoder enc = Encoder.SaveFlag;

            EncoderParameters ep = new EncoderParameters(2);
            ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
            ep.Param[1] = new EncoderParameter(Encoder.Compression, (long)compressEncoder);

            Bitmap pages = null;
            int frame = 0;
            ImageCodecInfo info = GetEncoderInfo("image/tiff");

            foreach (string strImageFile in imageFiles)
            {
                if (frame == 0)
                {
                    pages = (Bitmap)Image.FromFile(strImageFile);
                    //保存第一个tif文件 到目标处  
                    pages.Save(outFile, info, ep);
                }
                else
                {
                    //保存好第一个tif文件后,其余 设置为添加一帧到 图像中  
                    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);

                    Bitmap bm = (Bitmap)Image.FromFile(strImageFile);
                    pages.SaveAdd(bm, ep);
                    bm.Dispose();
                }

                if (frame == imageFiles.Count - 1)
                {
                    //flush and close.  
                    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
                    pages.SaveAdd(ep);
                }
                frame++;
            }
            pages.Dispose(); //释放资源  
            return;
        }

        /// <summary>  
        /// 拼接两个tif文件 保存到文件2中  
        /// </summary>  
        /// <param name="filePath">tif文件1</param>  
        /// <param name="targetFile">tif文件2</param>  
        public static void AppendToTiff(string filePath, string targetFile)
        {
            ArrayList list = new ArrayList(); //保存所有 tif文件路径  

            #region 分割tif文件1  

            string tempDirectory1 = string.Empty;
            list.AddRange(SplitTif(filePath, out tempDirectory1));

            #endregion

            #region 分割tif文件2  

            string tempDirectory2 = string.Empty;
            list.AddRange(SplitTif(targetFile, out tempDirectory2));

            #endregion

            //2. 拼接所有tif页  

            //2.1 删除原目标文件  
            File.Delete(targetFile);
            //2.2 拼接 并按原路径生成tif文件  
            JoinTiffImages(list, targetFile, EncoderValue.CompressionCCITT3);

            //3. 删除临时目录  
            DirectoryInfo di2 = new DirectoryInfo(tempDirectory2);
            di2.Delete(true);

            DirectoryInfo di1 = new DirectoryInfo(tempDirectory1);
            di1.Delete(true);

        }

        /// <summary>  
        /// 将给定文件  分割成多个tif文件 到临时目录下  
        /// </summary>  
        /// <param name="targetFile">目标文件</param>  
        /// <param name="tempDirectory">临时目录路径,删除用</param>  
        /// <returns>分割后多个文件路径集合</returns>  
        public static ArrayList SplitTif(string targetFile, out string tempDirectory)
        {
            ArrayList list = new ArrayList();
            using (Image img = Image.FromFile(targetFile))
            {
                Guid guid = img.FrameDimensionsList[0];

                System.Drawing.Imaging.FrameDimension dimension = new System.Drawing.Imaging.FrameDimension(guid);

                int nTotFrame = img.GetFrameCount(dimension); //tif总页数  

                int nLoop = 0; //索引  
                //生成临时目录 存放 单tif页  
                tempDirectory = Path.Combine(Path.GetDirectoryName(targetFile), Guid.NewGuid().ToString());
                if (!Directory.Exists(tempDirectory))
                {
                    Directory.CreateDirectory(tempDirectory);
                }

                EncoderParameters ep = new EncoderParameters(2);
                ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
                ep.Param[1] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT3);//压缩方式  CompressionCCITT3主要用于传真  

                ImageCodecInfo info = GetEncoderInfo("image/tiff");

                for (nLoop = 0; nLoop < nTotFrame; nLoop++)
                {
                    img.SelectActiveFrame(dimension, nLoop);
                    //保存 单tif页  
                    string newfilePath = Path.Combine(tempDirectory, nLoop.ToString() + ".tif");

                    img.Save(newfilePath, info, ep);
                    //将路径存入 list中  
                    list.Add(newfilePath);
                }
            }
            return list;
        }

        /// <summary>  
        /// 获取支持的编码信息  
        /// </summary>  
        /// <param name="mimeType">协议描述</param>  
        /// <returns>图像编码信息</returns>  
        private static ImageCodecInfo GetEncoderInfo(string mimeType)
        {
            ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
            for (int j = 0; j < encoders.Length; j++)
            {
                if (encoders[j].MimeType == mimeType)
                    return encoders[j];
            }

            throw new Exception(mimeType + " mime type not found in ImageCodecInfo");
        }

    }
}

 

posted @ 2016-12-13 15:43  -Ward-  阅读(1604)  评论(0编辑  收藏  举报