2008-12-29 55 views

回答

74

開始用它放入一個Image對象

Bitmap bitmap = (Bitmap)Image.FromFile(file); 

保存位圖存儲爲TIFF

MemoryStream byteStream = new MemoryStream(); 
bitmap.Save(byteStream, ImageFormat.Tiff); 

認沽TIFF文件到另一個Image對象

Image tiff = Image.FromStream(byteStream) 

第一的位圖準備編碼器:

ImageCodecInfo encoderInfo = GetEncoderInfo("image/tiff"); 

EncoderParameters encoderParams = new EncoderParameters(2); 
EncoderParameter parameter = new EncoderParameter(
    Encoder.Compression, (long)EncoderValue.CompressionCCITT4); 
encoderParams.Param[0] = parameter; 
parameter = new EncoderParameter(Encoder.SaveFlag, 
    (long)EncoderValue.MultiFrame); 
encoderParams.Param[1] = parameter; 

保存到文件:

tiff.Save(sOutFilePath, encoderInfo, encoderParams); 

對於後續頁面,準備編碼器:

EncoderParameters EncoderParams = new EncoderParameters(2); 
EncoderParameter SaveEncodeParam = new EncoderParameter(
    Encoder.SaveFlag, 
    (long)EncoderValue.FrameDimensionPage); 
EncoderParameter CompressionEncodeParam = new EncoderParameter(
    Encoder.Compression, (long)EncoderValue.CompressionCCITT4); 
EncoderParams.Param[0] = CompressionEncodeParam; 
EncoderParams.Param[1] = SaveEncodeParam; 
tiff.SaveAdd(/* next image as tiff - do the same as above with memory */, EncoderParams); 

最後刷新文件:

EncoderParameter SaveEncodeParam = new EncoderParameter(
    Encoder.SaveFlag, (long)EncoderValue.Flush); 
EncoderParams = new EncoderParameters(1); 
EncoderParams.Param[0] = SaveEncodeParam; 
tiff.SaveAdd(EncoderParams); 

這應該讓你開始。

+4

優秀的答案。如果你描述你是如何到達它的話(如果不是從試驗和錯誤中得知它的話),只能說它更完整,因爲MSDN文檔使它幾乎無法理解。 – 2009-06-16 19:47:13

+0

我想知道的是使用ImageFormat。Tiff在MemoryStream的Save方法中 - 顯然以後完成的「編碼」是一個完全不相關的過程 - 即將使用ImageFormat.Tiff保存的內存流的字節轉儲到文件中不會創建TIFF文件,我想呢? – 2011-01-13 11:36:54

3

當談到處理和創建標準格式文件時,不是微軟的記錄迷,我建議使用ImageMagick,以。MagickNet的形式提供.Net庫(當心,http://midimick.com/magicknet/當前有一個間諜軟件彈出窗口,我已經提醒網站所有者)。

19

在Google上搜索了一下後,發現了這篇文章。我試了一下a'b'c'd'e'f'g'h'的帖子中的代碼,但那對我沒有用。也許,我沒有做正確的事情。

在任何情況下,我發現另一篇文章保存圖像到多頁tiffs。這裏是該帖子的鏈接:http://www.bobpowell.net/addframes.htm

此外,這裏是代碼爲我工作。它應該與該帖子相同。

Encoder encoder = Encoder.SaveFlag; 
ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff"; 
EncoderParameters encoderParameters = new EncoderParameters(1); 
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

// Save the first frame of the multi page tiff 
Bitmap firstImage = (Bitmap) _scannedPages[0].RawContent; 
firstImage.Save(fileName, encoderInfo, encoderParameters); 

encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage); 

// Add the remining images to the tiff 
for (int i = 1; i < _scannedPages.Count; i++) 
{ 
    Bitmap img = (Bitmap) _scannedPages[i].RawContent; 
    firstImage.SaveAdd(img, encoderParameters); 
} 

// Close out the file 
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); 
firstImage.SaveAdd(encoderParameters); 
2

這是multi-tiff文件的拆分操作。它就像字符串子字符串函數一樣工作。圖像的第一個索引將是您的MasterBitMap,您將繼續將幀添加到MasterBitmap直到索引結束。

public void SaveMultiFrameTiff(int start, int end) 
    {    
     string outputFileName = "out.TIF"; 
     string inputFileName = "input.TIF";    

     try 
     {     

      Bitmap MasterBitmap = new Bitmap(inputFileName); //Start page of document(master) 
      Image imageAdd = Image.FromFile(inputFileName); //Frame Image that will be added to the master   
      Guid guid = imageAdd.FrameDimensionsList[0]; //GUID 
      FrameDimension dimension = new FrameDimension(guid); 
      // start index cannot be less than 0 and cannot be greater than frame count   
      if (start < 1 || end > MasterBitmap.GetFrameCount(dimension)) { return; }   

      EncoderParameters ep = new EncoderParameters(1); 

      //Get Image Codec Information 
      ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
      ImageCodecInfo codecInfo = codecs[3]; //image/tiff 

      //MultiFrame Encoding format 
      EncoderParameter epMultiFrame = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); 
      ep.Param[0] = epMultiFrame; 
      MasterBitmap.SelectActiveFrame(dimension, start - 1); 
      MasterBitmap.Save(outputFileName, codecInfo, ep);//create master document 

      //FrameDimensionPage Encoding format 
      EncoderParameter epFrameDimensionPage = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); 
      ep.Param[0] = epFrameDimensionPage; 

      for (int i = start; i < end; i++) 
      { 
       imageAdd.SelectActiveFrame(dimension, i);//select next frame 
       MasterBitmap.SaveAdd(new Bitmap(imageAdd), ep);//add it to the master 
      } 

      //Flush Encoding format 
      EncoderParameter epFlush = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush); 
      ep.Param[0] = epFlush; 
      MasterBitmap.SaveAdd(ep); //flush the file     
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 
4

有幫助的話題。謝謝(你的)信息。我需要從base64編碼的字符串數組中拼接多頁圖像。這是我基於這個線程中的信息放在一起的。我不太瞭解爲什麼我必須創建一個具有明確指定的圖像格式的內存流,但這是結束了工作,如果有更好的方式來處理這個請讓我知道。謝謝

/// <summary> 
    /// Takes in an array of base64 encoded strings and creates a multipage tiff. 
    /// </summary> 
    /// <param name="sOutFile">file to be generated</param> 
    /// <param name="pagesbase64Array"></param> 
    private void SaevAsMultiPageTiff(string sOutFile, string[] pagesbase64Array) 
    { 
     System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.SaveFlag; 
     ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff"); 
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

     Bitmap firstImage = null; 
     try 
     { 

      using (MemoryStream ms1 = new MemoryStream()) 
      { 
       using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(pagesbase64Array[0]))) 
       { 
        Image.FromStream(ms).Save(ms1, ImageFormat.Tiff); 
        firstImage = (Bitmap)Image.FromStream(ms1); 
       } 
       // Save the first frame of the multi page tiff 
       firstImage.Save(sOutFile, encoderInfo, encoderParameters); //throws Generic GDI+ error if the memory streams are not open when this is called 
      } 


      encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage); 

      Bitmap imagePage; 
      // Add the remining images to the tiff 
      for (int i = 1; i < pagesbase64Array.Length; i++) 
      { 

       using (MemoryStream ms1 = new MemoryStream()) 
       { 
        using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(pagesbase64Array[i]))) 
        { 
         Image.FromStream(ms).Save(ms1, ImageFormat.Tiff); 
         imagePage = (Bitmap)Image.FromStream(ms1); 
        } 

        firstImage.SaveAdd(imagePage, encoderParameters); //throws Generic GDI+ error if the memory streams are not open when this is called 
       } 
      } 

     } 
     catch (Exception) 
     { 
      //ensure the errors are not missed while allowing for flush in finally block so files dont get locked up. 
      throw; 
     } 
     finally 
     { 
      // Close out the file 
      encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); 
      firstImage.SaveAdd(encoderParameters); 
     } 
    } 
相關問題