using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq;namespace Common {////// Title Tif文件合并类/// Author:ward/// public class Tiff{/// /// 获取图像页数 /// /// /// 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);}}/// /// 将给定的文件 拼接输出到指定的tif文件路径 /// /// 文件路径列表 /// 拼接后保存的 tif文件路径 /// 压缩方式,建议CompressionCCITT4 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;}/// /// 拼接两个tif文件 保存到文件2中 /// /// tif文件1 /// tif文件2 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);}/// /// 将给定文件 分割成多个tif文件 到临时目录下 /// /// 目标文件 /// 临时目录路径,删除用 /// 分割后多个文件路径集合 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;}/// /// 获取支持的编码信息 /// /// 协议描述 /// 图像编码信息 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");}} }