2010-08-25 16 views

risposta

6

È necessario selezionare il frame attivo (pagina) in un ciclo e convertire ogni pagina tiff a un 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 
} 

Questo codice presuppone che sia possibile caricare l'immagine Tiff nell'oggetto System.Drawing.Bitmap.

1

Imagemagick può fare praticamente qualsiasi cosa con le immagini, ma potrebbe richiedere del tempo per farlo correttamente a causa della grande quantità di opzioni tra cui scegliere. Puoi usare interop per lavorare direttamente con Imagemagick o puoi usare un wrapper .NET. Ho usato solo interop quindi non so quanto sia buono o cattivo lo wrapper.

I parametri che dovrete scoprire sul sito Web ImageMagick. Guarda la guida per il parametro della riga di comando e cerca il forum per tiff multipagina. Immagino tu voglia dividere il tiff in più pngs? Allora forse qualcosa di simile:

convertito MULTIPAGE.TIF singolo% d.png

1

Esempio completo senza la necessità di assemblee di partito 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

grazie @ Tom Halladay

vi fornirò una versione C# del codice

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); 
    } 
} 
Problemi correlati