2025年3月21日 星期五 甲辰(龙)年 月廿 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > .net

操作tiff文件——合并、分割

时间:03-24来源:作者:点击数:37

操作tiff文件的帮助类

  • public class TiffHelper
  • {
  • /// <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">压缩方式</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");
  • }
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门