首页 > Tif文件合并类

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
{/// /// 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");}}
}

 

转载于:https://www.cnblogs.com/lee2011/p/6170238.html

更多相关:

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...

  • 有时候我们项目,在执行某个操作后,会生成一些数据结果,如报表一类的东西,我们需要对结果进行保存,甚至是生成word文档。 那么首先获取到控件快照就最基本的条件。 生成快照的静态方法类 using System; using System.Collections.Generic; using System.Drawing; using...

  • 作用批量执行sql语句 表达式.RunSQL(SQLStatement,UseTransaction) 表达式.一个代表DoCmd对象的变量。 注释:sqlstatement参数的最大长度为 32,768 个字符(而"宏"窗口中的 SQL 语句操作参数的最大长度为 256 个字符)。      官方说仅能用于Microsoft Acc...

  • 前戏:针对上一篇列出来的功能点,今天和大家分享下这个自定义的公式是怎么设计的,由于我的第一篇博客在首页被管理员移走了,大家可以点击这里来跳转,看下第一篇的目录结构。本人作为老菜鸟,和大家分享的也是一些老菜鸟的想法,大神千万别喷我.   设计背景:当初为什么要设计这个自定义的计算公式呢,原因就是,这个价格是不确定的,计算方式也是不确定的...

  • 背景 搭建一个适合公司erp业务的开发平台。 架构概要图:    流程引擎开发平台:  包含流程引擎设计器,流程管理平台,流程引擎服务。目前只使用单个数据库进行管理。  流程引擎设计器    采用silverlight进行开发,本质是对流程模型进行设计,并生成xml。包含:人工节点,自动节点,并行开始节点,并行结束节点,消息节点,文...

  • using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Web; namespace BLL{    public  class XmlDoc    {       ...