2010-08-25 80 views

回答

6

你應該選擇在一個循環活動框架(頁面),每個TIFF頁面轉換成PNG。

int pageCount = 1; 
try 
{ 
    pageCount = bmp.GetFrameCount(FrameDimension.Page); 
} 
catch (Exception) 
{ 
    // sometimes GDI+ throws internal exceptions. 
    // just ignore them. 
} 

for (int page = 0; page < pageCount; page++) 
{ 
    bmp.SelectActiveFrame(FrameDimension.Page, page); 
    // save or otherwise process tiff page 
} 

此代碼假定您可以在System.Drawing.Bitmap對象中加載Tiff圖像。

1

Imagemagick可以對圖像做任何事情,但由於可供選擇的選項太多,可能需要一段時間才能完成。您可以使用interop直接使用Imagemagick,也可以使用.NET包裝器。我只用interop,所以我不知道wrapper有多好或不好。

private readonly ImageMagickObject.MagickImageClass _imageMagick = new ImageMagickObject.MagickImageClass(); 

var parameters = new object[] {sourcePath, destPath}; 
_imageMagick.Convert(ref parameters); 

您必須在ImageMagick網站上找到自己的參數。查看命令行參數的幫助,並搜索論壇中的多頁TIFF。我假設你想把tiff分成多個pngs?那麼,也許是這樣的:

轉換multipage.tif單%d.png

1

無需3'rd方組件的完整例子:

' MAIN CODE ' 

Dim ImageBitmap = Bitmap.FromStream(ImageStream) 

Dim FrameCount = ImageBitmap.GetFrameCount(FrameDimension.Page) 

Dim RunningHeight As Integer = 0 
Dim MaxWidth As Integer = 0 

For MeasurementFrameIndex As Integer = 0 To FrameCount - 1 
    ImageBitmap.SelectActiveFrame(FrameDimension.Page, MeasurementFrameIndex) 

    RunningHeight += ImageBitmap.Height 
    MaxWidth = Math.Max(MaxWidth, ImageBitmap.Width) 
Next 

Dim CombinedBitmap As New Bitmap(MaxWidth, RunningHeight) 
Dim RunningVerticalPosition As Integer = 0 

For CombinationFrameIndex As Integer = 0 To FrameCount - 1 
    ImageBitmap.SelectActiveFrame(FrameDimension.Page, CombinationFrameIndex) 

    EmbedBitmap(ImageBitmap, CombinedBitmap, RunningVerticalPosition) 

    RunningVerticalPosition += ImageBitmap.Height + 1 
Next 



    ' SUPPORT ROUTINES ' 

Private Shared Sub EmbedBitmap(
     SourceBitmap As Bitmap, 
     ByRef DestinationBitmap As Bitmap, 
     VerticalPosition As Integer) 

    Dim SourceRectangle As New Rectangle(
     New Point(0, 0), 
     New Size(SourceBitmap.Width, SourceBitmap.Height)) 

    Dim DestinationRectangle As New Rectangle(
     New Point(0, VerticalPosition), 
     New Size(SourceBitmap.Width, SourceBitmap.Height)) 

    Using Canvas As Graphics = Graphics.FromImage(DestinationBitmap) 
     Canvas.DrawImage(
      SourceBitmap, 
      DestinationRectangle, 
      SourceRectangle, 
      GraphicsUnit.Pixel) 
    End Using 
End Sub 
6

感謝@湯姆哈勒戴

我會提供你的代碼的C#版本

private static Bitmap ConvertTiffToBitmapStream(byte[] tiffImage){ 
    System.Drawing.Image ImageBitmap = Bitmap.FromStream(new MemoryStream(tiffImage)); 
    int FrameCount = ImageBitmap.GetFrameCount(FrameDimension.Page); 
    int RunningHeight = 0; 
    int MaxWidth = 0; 

    for (int MeasurementFrameIndex = 0; MeasurementFrameIndex <= FrameCount - 1; MeasurementFrameIndex++){ 
     ImageBitmap.SelectActiveFrame(FrameDimension.Page, MeasurementFrameIndex); 
     RunningHeight += ImageBitmap.Height; 
     MaxWidth = Math.Max(MaxWidth, ImageBitmap.Width); 
    } 

    Bitmap CombinedBitmap = new Bitmap(MaxWidth, RunningHeight); 
    int RunningVerticalPosition = 0; 

    for (int CombinationFrameIndex = 0; CombinationFrameIndex <= FrameCount - 1; CombinationFrameIndex++){ 
     ImageBitmap.SelectActiveFrame(FrameDimension.Page, CombinationFrameIndex); 
     EmbedBitmap(new Bitmap(ImageBitmap), ref CombinedBitmap, RunningVerticalPosition); 
     RunningVerticalPosition += ImageBitmap.Height + 1; 
    } 
    return CombinedBitmap; 
} 

private static void EmbedBitmap(Bitmap SourceBitmap, ref Bitmap DestinationBitmap, int VerticalPosition){ 
    Rectangle SourceRectangle = new Rectangle(new Point(0, 0), new Size(SourceBitmap.Width, SourceBitmap.Height)); 
    Rectangle DestinationRectangle = new Rectangle(new Point(0, VerticalPosition), new Size(SourceBitmap.Width, SourceBitmap.Height)); 

    using (Graphics Canvas = Graphics.FromImage(DestinationBitmap)){ 
     Canvas.DrawImage(SourceBitmap, DestinationRectangle, SourceRectangle, GraphicsUnit.Pixel); 
    } 
}