Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert multipage TIFF to PNG .Net

I am able to convert a single page TIFF to a PNG in .Net, however, how would I do this for a multipage TIFF?

like image 695
mytwocents Avatar asked Aug 25 '10 14:08

mytwocents


People also ask

How do I convert a multipage TIFF file to JPEG?

Hit CTRL + P, or navigate to the printing dialog by clicking File > Print… From the list of available printers, choose Universal Document Converter, then select the Properties option. When the Properties window is displayed, choose Load Settings… From the list of available settings, select PDF to JPEG.


3 Answers

thanks @Tom Halladay

I'll provide a c# version of your 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);
    }
}
like image 193
Alyson Freitas Avatar answered Sep 28 '22 03:09

Alyson Freitas


You should select active frame (page) in a loop and convert each tiff page to a 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
}

This code assumes that you can load Tiff image in System.Drawing.Bitmap object.

like image 43
Bobrovsky Avatar answered Sep 28 '22 05:09

Bobrovsky


Complete example without the need for 3'rd party assemblies:

' 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
like image 29
Tom Halladay Avatar answered Sep 28 '22 05:09

Tom Halladay