2008-12-29 39 views

Trả lời

74

Bắt đầu với bitmap đầu tiên bằng cách đặt nó vào một đối tượng Image

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

Save bitmap vào bộ nhớ như tiff

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

Đặt Tiff vào một đối tượng Image

Image tiff = Image.FromStream(byteStream) 

Chuẩn bị bộ mã hóa:

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; 

Lưu dạng file:

tiff.Save(sOutFilePath, encoderInfo, encoderParams); 

Đối với các trang tiếp theo, chuẩn bị mã hóa:

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); 

Cuối cùng tuôn file:

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

Điều đó sẽ giúp bạn bắt đầu.

+4

Câu trả lời hay. Chỉ có thể được hoàn chỉnh hơn nếu bạn mô tả cách bạn đến nó (nơi bạn học nó nếu không phải từ thử và sai) vì các tài liệu MSDN làm cho nó bên cạnh không thể hiểu được. –

+0

Điều tôi đang băn khoăn là sử dụng ImageFormat.Tiff trong phương pháp SaveStream của MemoryStream - rõ ràng là "mã hóa" được thực hiện sau là một quá trình hoàn toàn không liên quan - nghĩa là bán các byte của luồng bộ nhớ đã được lưu bằng ImageFormat.Tiff vào một tệp sẽ không tạo tệp TIFF, tôi giả sử? –

+4

Chức năng "GetEncoderInfo" là gì? –

3

Không phải là người hâm mộ hồ sơ theo dõi của Microsoft khi xử lý và tạo tệp các định dạng chuẩn, tôi khuyên bạn nên sử dụng ImageMagick, có sẵn dưới dạng thư viện .Net ở dạng MagickNet (hãy cẩn thận, http://midimick.com/magicknet/ hiện có cửa sổ bật lên phần mềm gián điệp , Tôi đã thông báo cho chủ sở hữu trang web).

19

Đến với bài đăng này sau một chút tìm kiếm trên Google. Tôi đã thử mã đã được đăng trong a'b'c'd'e'f'g'h ', nhưng điều đó đã không làm việc cho tôi. Có lẽ, tôi đã không làm điều gì đó một cách chính xác.

Trong mọi trường hợp, tôi tìm thấy một bài đăng khác đã lưu hình ảnh vào nhiều trang tiff. Đây là liên kết tới bài đăng: http://www.bobpowell.net/addframes.htm

Ngoài ra, đây là mã làm việc cho tôi. Nó phải giống hệt với bài đăng đó.

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); 
+1

cho những người lười biếng như tôi mã này đã làm việc dễ dàng! – Pisu

2

Đây là thao tác chia nhỏ tệp nhiều tệp tiff. Nó hoạt động giống như chức năng chuỗi con chuỗi. Chỉ mục đầu tiên của hình ảnh sẽ là MasterBitMap của bạn và bạn sẽ tiếp tục thêm khung vào MasterBitmap cho đến khi kết thúc chỉ mục.

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

chủ đề hữu ích. Cảm ơn bạn về thông tin. Tôi đã có một nhu cầu để khâu một hình ảnh multipage từ một loạt các chuỗi mã hóa base64. Đây là những gì tôi đặt lại với nhau dựa trên thông tin trong chủ đề này. Tôi không hoàn toàn hiểu tại sao tôi phải tạo một luồng bộ nhớ với định dạng hình ảnh được chỉ định rõ ràng nhưng đây là những gì đã kết thúc, nếu có cách tốt hơn để giải quyết vấn đề này, hãy cho tôi biết. cảm ơn

/// <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); 
     } 
    } 
Các vấn đề liên quan