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> /// 獲取圖像頁(yè)數(shù) /// </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){//如果只有一個(gè)文件,直接復(fù)制到目標(biāo) 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);//保存第一個(gè)tif文件 到目標(biāo)處 pages.Save(outFile, info, ep);}else{//保存好第一個(gè)tif文件后,其余 設(shè)置為添加一幀到 圖像中 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> /// 拼接兩個(gè)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頁(yè) //2.1 刪除原目標(biāo)文件 File.Delete(targetFile);//2.2 拼接 并按原路徑生成tif文件 JoinTiffImages(list, targetFile, EncoderValue.CompressionCCITT3);//3. 刪除臨時(shí)目錄 DirectoryInfo di2 = new DirectoryInfo(tempDirectory2);di2.Delete(true);DirectoryInfo di1 = new DirectoryInfo(tempDirectory1);di1.Delete(true);}/// <summary> /// 將給定文件 分割成多個(gè)tif文件 到臨時(shí)目錄下 /// </summary> /// <param name="targetFile">目標(biāo)文件</param> /// <param name="tempDirectory">臨時(shí)目錄路徑,刪除用</param> /// <returns>分割后多個(gè)文件路徑集合</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總頁(yè)數(shù) int nLoop = 0; //索引 //生成臨時(shí)目錄 存放 單tif頁(yè) 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頁(yè) string newfilePath = Path.Combine(tempDirectory, nLoop.ToString() + ".tif");img.Save(newfilePath, info, ep);//將路徑存入 list中 list.Add(newfilePath);}}return list;}/// <summary> /// 獲取支持的編碼信息 /// </summary> /// <param name="mimeType">協(xié)議描述</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");}} }
?
轉(zhuǎn)載于:https://www.cnblogs.com/lee2011/p/6170238.html
總結(jié)
- 上一篇: 为什么为什么是什么歌啊?
- 下一篇: 狗疫苗多少钱啊?