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[];
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 == )
{
File.Copy((string)imageFiles[], outFile, true);
return;
} Encoder enc = Encoder.SaveFlag; EncoderParameters ep = new EncoderParameters();
ep.Param[] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
ep.Param[] = new EncoderParameter(Encoder.Compression, (long)compressEncoder); Bitmap pages = null;
int frame = ;
ImageCodecInfo info = GetEncoderInfo("image/tiff"); foreach (string strImageFile in imageFiles)
{
if (frame == )
{
pages = (Bitmap)Image.FromFile(strImageFile);
//保存第一个tif文件 到目标处
pages.Save(outFile, info, ep);
}
else
{
//保存好第一个tif文件后,其余 设置为添加一帧到 图像中
ep.Param[] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage); Bitmap bm = (Bitmap)Image.FromFile(strImageFile);
pages.SaveAdd(bm, ep);
bm.Dispose();
} if (frame == imageFiles.Count - )
{
//flush and close.
ep.Param[] = 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[]; System.Drawing.Imaging.FrameDimension dimension = new System.Drawing.Imaging.FrameDimension(guid); int nTotFrame = img.GetFrameCount(dimension); //tif总页数 int nLoop = ; //索引
//生成临时目录 存放 单tif页
tempDirectory = Path.Combine(Path.GetDirectoryName(targetFile), Guid.NewGuid().ToString());
if (!Directory.Exists(tempDirectory))
{
Directory.CreateDirectory(tempDirectory);
} EncoderParameters ep = new EncoderParameters();
ep.Param[] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
ep.Param[] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT3);//压缩方式 CompressionCCITT3主要用于传真 ImageCodecInfo info = GetEncoderInfo("image/tiff"); for (nLoop = ; 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 = ; j < encoders.Length; j++)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
} throw new Exception(mimeType + " mime type not found in ImageCodecInfo");
} }
}
05-06 18:39