7

我可以在 .Net 中将单页 TIFF 转换为 PNG,但是,我将如何为多页 TIFF 执行此操作?

4

4 回答 4

8

谢谢@Tom Halladay

我将提供您的代码的 ac# 版本

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);
    }
}
于 2015-11-23T23:30:06.017 回答
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 图像。

于 2010-08-25T17:34:12.860 回答
3

无需第 3 方集会的完整示例:

' 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
于 2014-07-07T18:43:22.710 回答
1

Imagemagick几乎可以对图像做任何事情,但由于可供选择的选项太多,可能需要一段时间才能正确完成。您可以使用互操作直接与 Imagemagick 一起工作,也可以使用 .NET 包装器。我只使用了互操作,所以我不知道包装器的好坏。

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

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

您必须在 ImageMagick 网站上自行查找参数。查看命令行参数的帮助,并在论坛中搜索 multipage tiff。我假设您想将 tiff 拆分为多个 png?然后可能是这样的:

转换 multipage.tif single%d.png

于 2010-08-25T14:48:32.893 回答