image 合并

 
编译环境: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();
..........................................
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值