编译环境:VS 2003
语言:C#
描述:三tif文件:a.tif(two pages),b.tif(three pages),c.tif(two pages)
合并为net.tif(seven pages)
代码:
………………………………………
using
System;
using
System.IO;
using
System.Drawing;
using
System.Drawing.Imaging;
using
System.Collections;
using
System.Runtime.InteropServices;
namespace
WF.lib
{
///<summary>
/// ManagerImage 的摘要说明。
///</summary>
public class ManagerImage// : IDisposable
{
// private Image image;
public ManagerImage()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
// public ManagerImage(string imageFileName)
// {
// image = Image.FromFile(imageFileName);
// }
///
<summary>
///
get file page number
///
</summary>
///
<param name="image"></param>
///
<returns></returns>
private int GetPageNumber(string imageFileName)
{
int imgPageNumber;
Image image = Image.FromFile(imageFileName);
Guid objGuid = image.FrameDimensionsList[0];
FrameDimension objDimension = new FrameDimension(objGuid);
//gets the total number of frames in the .tiff file
imgPageNumber = image.GetFrameCount(objDimension);
image.Dispose();
return imgPageNumber;
}
///<summary>
/// Read the image base string,
/// Assert(GetFileNameStartString(@"c:/test/abc.tif"),"abc")
///</summary>
///<param name="strFullName"></param>
///<returns>file name</returns>
private string GetFileNameStartString(string strFullName)
{
//jason 2007-02-13 modify
int posDot=strFullName.LastIndexOf(".");
int posSlash=strFullName.LastIndexOf(@"/");
// int posDot=_ImageFileName.LastIndexOf(".");
// int posSlash=_ImageFileName.LastIndexOf(@"/");
// return _ImageFileName.Substring(posSlash+1,posDot-posSlash-1);
return strFullName.Substring(posSlash+1,posDot-posSlash-1);
}
///<summary>
/// This function will output the image to a TIFF file with specific compression format
///</summary>
///<param name="outPutDirectory">The splited images' directory</param>
///<param name="format">The codec for compressing</param>
///<returns>splited file name array list</returns>
public ArrayList SplitTiffImage(string outPutDirectory,EncoderValue format,string strFileName)
{
Image image;
image = Image.FromFile(strFileName);
string fileStartString=outPutDirectory+"//"+GetFileNameStartString(strFileName);
ArrayList splitedFileNames=new ArrayList();
try
{
//jason 2007-012-13
int imagePageNum = GetPageNumber(strFileName);
Guid objGuid=image.FrameDimensionsList[0];
FrameDimension objDimension=new FrameDimension(objGuid);
//Saves every frame as a separate file.
Encoder enc=Encoder.Compression;
int curFrame=0;
for (int i=0;i<imagePageNum;i++)
{
image.SelectActiveFrame(objDimension,curFrame);
EncoderParameters ep=new EncoderParameters(1);
ep.Param[0]=new EncoderParameter(enc,(long)format);
ImageCodecInfo info=GetEncoderInfo("image/tiff");
//Save the master bitmap
string fileName=string.Format("{0}{1}.tif",fileStartString,i.ToString());
image.Save(fileName,info,ep);
splitedFileNames.Add(fileName);
curFrame++;
}
image.Dispose();
}
catch (Exception)
{
throw;
}
return splitedFileNames;
}
///<summary>
/// This function will join the TIFF file with a specific compression format
///</summary>
///<param name="imageFiles">string array with source image files</param>
///<param name="outFile">target TIFF file to be produced</param>
///<param name="compressEncoder">compression codec enum</param>
public void JoinTiffImages(string[] imageFiles,string outFile,EncoderValue compressEncoder)
{
try
{
//If only one page in the collection, copy it directly to the target file.
if (imageFiles.Length==1)
{
File.Copy(imageFiles[0],outFile,true);
return;
}
//use the save encoder
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);
//save the first frame
pages.Save(outFile,info,ep);
}
else
{
//save the intermediate frames
ep.Param[0]=new EncoderParameter(enc,(long)EncoderValue.FrameDimensionPage);
Bitmap bm=(Bitmap)Image.FromFile(strImageFile);
pages.SaveAdd(bm,ep);
}
if(frame==imageFiles.Length-1)
{
//flush and close.
ep.Param[0]=new EncoderParameter(enc,(long)EncoderValue.Flush);
pages.SaveAdd(ep);
}
frame++;
}
}
catch (Exception)
{
throw;
}
return;
}
///<summary>
/// This function will join the TIFF file with a specific compression format
///</summary>
///<param name="imageFiles">array list with source image files</param>
///<param name="outFile">target TIFF file to be produced</param>
///<param name="compressEncoder">compression codec enum</param>
public void JoinTiffImages(ArrayList imageFiles,string outFile,EncoderValue compressEncoder)
{
try
{
//If only one page in the collection, copy it directly to the target file.
if (imageFiles.Count==1)
{
File.Copy((string)imageFiles[0],outFile,true);
return;
}
//use the save encoder
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);
//save the first frame
pages.Save(outFile,info,ep);
}
else
{
//save the intermediate frames
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();
}
catch (Exception ex)
{
#if
DEBUG
Console.WriteLine(ex.Message);
#endif
throw;
}
return;
}
///<summary>
/// Getting the supported codec info.
///</summary>
///<param name="mimeType">description of mime type</param>
///<returns>image codec info</returns>
private 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" );
}
///<summary>
/// Return the memory steam of a specific page
///</summary>
///<param name="pageNumber">page number to be extracted</param>
///<returns>image object</returns>
public Image GetSpecificPage(int pageNumber,string imageFileName)
{
Image image;
image = Image.FromFile(imageFileName);
MemoryStream ms=null;
Image retImage=null;
try
{
ms=new MemoryStream();
Guid objGuid=image.FrameDimensionsList[0];
FrameDimension objDimension=new FrameDimension(objGuid);
image.SelectActiveFrame(objDimension,pageNumber);
image.Save(ms,ImageFormat.Bmp);
retImage=Image.FromStream(ms);
image.Dispose();
return retImage;
}
catch (Exception)
{
ms.Close();
retImage.Dispose();
throw;
}
}
///
<summary>
///
get join iamge
///
Jason 2007-02-15
///
</summary>
///
<param name="imageFiles">
file arraylist
</param>
///
<param name="splitedFileDir">
split file temp dir
</param>
///
<param name="outputDir">
join image directory
</param>
///
<returns>
join image full name
</returns>
public string GetImage(ArrayList imageFiles, string splitedFileDir,string outputDir)
{
string rtnImageFile = "", outputFileName = "";
ArrayList imageList = new ArrayList();
//no file
if(imageFiles.Count == 0)
{
return "";
}
//get outputFileName
outputFileName = GetFileNameStartString(imageFiles[0].ToString())+DateTime.Now.ToString("yyMMddHHss");
rtnImageFile = outputDir+"//"+outputFileName+".tif";
//delete null value
for(int i=0;i<imageFiles.Count;i++)
{
if(imageFiles[i].ToString().Equals(""))
{
imageFiles.RemoveAt(i);
}
}
//split image files
//onel one file
if(imageFiles.Count == 1)
{
File.Copy(imageFiles[0].ToString(),rtnImageFile,true);
return rtnImageFile;
}
//more than one file
for(int i=0;i<imageFiles.Count;i++)
{
imageList.AddRange(SplitTiffImage(splitedFileDir,System.Drawing.Imaging.EncoderValue.CompressionNone,imageFiles[i].ToString()));
}
JoinTiffImages(imageList,rtnImageFile,System.Drawing.Imaging.EncoderValue.CompressionNone);
return rtnImageFile;
}
#region
IDisposable Members
public void Dispose()
{
// //jason add
// if(image != null)
// image.Dispose();
System.GC.SuppressFinalize(this);
}
#endregion
}
}
…………………………..
引用类:
ManagerImage manImage = new ManagerImage();
ArrayList fileListA = new ArrayList();
// ArrayList fileListB = new ArrayList();
fileListA = manImage.SplitTiffImage(@"C:/itweb_src/WF/image/temp",System.Drawing.Imaging.EncoderValue.CompressionNone,@"C:/itweb_src/WF/image/body.tif");
fileListA.AddRange(manImage.SplitTiffImage(@"C:/itweb_src/WF/image/temp",System.Drawing.Imaging.EncoderValue.CompressionNone,@"C:/itweb_src/WF/image/body_2.tif"));
// fileListB = manImage.SplitTiffImage(@"C:/itweb_src/WF/image/temp",System.Drawing.Imaging.EncoderValue.CompressionNone,@"C:/itweb_src/WF/image/body_2.tif");
// fileListA.AddRange(fileListB);
string outFileName = @"C:/itweb_src/WF/image/new.tif";
// string outFileNameB = @"C:/itweb_src/WF/image/newB.tif";
manImage.JoinTiffImages(fileListA,outFileName,System.Drawing.Imaging.EncoderValue.CompressionNone);
引用方法二:
code in page:.............
string splitedFileDir = Application.StartupPath.ToString()+"//image//_temp";
string outPutDir = Application.StartupPath.ToString()+"//image//data";
string outputFileName = "";
ArrayList fileList = new ArrayList();
fileList.Add(......filename);
ManagerImage manImage = new ManagerImage();
outputFileName = manImage.GetImage(fileList,splitedFileDir,outPutDir);
//release the resource
manImage.Dispose();
fileList.Clear();
..........................................