2010-01-24 69 views
1

我試圖用code by Bob Powell以從現有圖片的多頁TIFF文件:生成多頁TIFF不工作

picture.SelectActiveFrame(FrameDimension.Page, 0); 
var image = new Bitmap(picture); 
using (var stream = new MemoryStream()) 
{ 
    ImageCodecInfo codecInfo = null; 
    foreach (var imageEncoder in ImageCodecInfo.GetImageEncoders()) 
    { 
     if (imageEncoder.MimeType != "image/tiff") continue; 
     codecInfo = imageEncoder; 
     break; 
    } 
    var parameters = new EncoderParameters 
    { 
     Param = new [] 
     { 
      new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.MultiFrame) 
     } 
    }; 
    image.Save(stream, codecInfo, parameters); 

    parameters = new EncoderParameters 
    { 
     Param = new[] 
     { 
      new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.FrameDimensionPage) 
     } 
    }; 
    for (var i = 1; i < picture.GetFrameCount(FrameDimension.Page); i++) 
    { 
     picture.SelectActiveFrame(FrameDimension.Page, i); 
     var img = new Bitmap(picture); 
     image.SaveAdd(img, parameters); 

    } 

    parameters = new EncoderParameters 
    { 
     Param = new[] 
     { 
      new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush) 
     } 
    }; 
    image.SaveAdd(parameters); 
    stream.Flush(); 
} 

但它不工作(僅限第一幀包含在圖像中)和我不知道爲什麼。

我想要做的是更改TIFF文件的特定幀(添加註釋)。

我不知道是否有一個更簡單的方法來做到這一點,但我想到的是從原始圖片創建一個多頁TIFF並添加我自己的圖片,而不是該幀。

+1

請解釋「它不工作」。發生了什麼,什麼失敗了,你會得到什麼錯誤(如果有的話)? – 2010-01-24 14:19:07

+0

它只產生一個圖像對象,只有第一幀沒有添加其他幀。 – Beatles1692 2010-01-24 14:32:33

+1

當我嘗試它時,你的代碼工作正常。你是否確認源圖像有多個頁面?你是否正確保存了MemoryStream? – 2010-01-24 15:35:42

回答

0

看來,這個過程不會改變圖像的對象,但它改變了流,所以我應該得到的內存流緩衝和構建另一個圖像對象:

var buffer=stream.GetBuffer(); 
using(var newStream=new MemoryStream(buffer)) 
{ 
var result=Image.FromStream(newStream); 
} 

現在,結果將包括所有幀。

+0

嗨,你可以請更新適合你的解決方案嗎?我嘗試了你上面提出的建議,但沒有爲我工作。 – seUser 2016-02-02 17:19:15

+0

此解決方案對我無效 – 2016-05-03 17:35:13

1

[刪除評論後,第一部分]

我使用LibTIFF.NET多頁TIFF工作;我發現使用標準庫處理TIFF的許多快速操作(內存相關,並且在16位灰度圖像上也一致崩潰)。

你的測試圖像是什麼?你是否嘗試過多幀tiff(最好在第一幀有一個大的'1',下一個有2'等等;這可以幫助你確定文件中包含的幀。診斷可能是tiffdump工具,如包含在二進制文件的libtiff(也適用於Windows)。這會告訴你,你有什麼框架。

Using LibTiff from c# to access tiled tiff images

[編輯]如果您想了解.NET東西:我發現了一個使用標準.NET功能的多頁面tiff的新資源(儘管我會堅持使用LibTIFF.NET):TheCodeProject : Save images into a multi-page TIFF file...如果你下載它,Form1.cs函數saveMultipage(..)中的代碼片段與您的代碼相似(但仍略有不同)。特別是最後的沖洗以不同的方式完成,並且該文件在第一幀之前被刪除...

+0

謝謝Adriaan.Your答案幫了我很多,因爲我不知道有一個開源tiff庫在那裏。我會立即嘗試。 關於for循環:我已經使用第一幀來構建圖像本身: picture.SelectActiveFrame(FrameDimension.Page,0); var image = new Bitmap(picture); – Beatles1692 2010-01-26 14:52:53