2010-08-25 7 views

Répondre

6

Vous devriez choisir un encadrement actif (page) dans une boucle et convertir chaque page tiff à 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 
} 

Ce code suppose que vous pouvez charger l'image TIFF dans l'objet System.Drawing.Bitmap.

1

ImagemagickImagemagickImagemagick peut faire à peu près tout avec des images, mais il peut prendre un certain temps pour le faire correctement en raison de la quantité impressionnante d'options à choisir. Vous pouvez utiliser interop pour travailler directement avec Imagemagick ou vous pouvez utiliser un wrapper .NET. J'ai seulement utilisé interop donc je ne sais pas comment bon ou mauvais le wrapper est.

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

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

Les paramètres que vous aurez à découvrir par vous-même sur le site Web ImageMagick. Regardez l'aide pour le paramètre de ligne de commande et recherchez le tiff multipage sur le forum. Je suppose que vous voulez diviser le tiff en plusieurs pngs? Alors peut-être quelque chose comme ceci:

converti simple% d.png

1

Exemple complet sans la nécessité d'assemblées de parti 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

merci Halladay @ Tom

Je vais fournir une version C# de votre code

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); 
    } 
} 
Questions connexes