侧边栏壁纸
博主头像
拾荒的小海螺博主等级

只有想不到的,没有做不到的

  • 累计撰写 140 篇文章
  • 累计创建 15 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
WIN

C#:如何拆分TIF文件生成Image格式

拾荒的小海螺
2024-04-26 / 0 评论 / 0 点赞 / 9 阅读 / 5867 字

1、简介

在本文中,我们将介绍如何使用 BitMiracle.LibTiff.NET 库来拆分 TIF 文件并生成相应的 Image 图像。BitMiracle.LibTiff.NET 是一个开源的 TIF 图像处理库,它提供了强大的功能来读取和处理 TIF 文件。

ED3390C7-E65F-48d0-B631-567C409C80C4.png

2、通过Image来拆分

使用 System.Drawing.Image 类来拆分 TIFF 文件,并将每个帧转换为 System.Drawing.Image 对象,你可以使用以下代码示例:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string inputFilePath = "路径\\到\\你的\\文件.tif";
        string outputFolderPath = "路径\\到\\输出文件夹\\";

        using (Image tiffImage = Image.FromFile(inputFilePath))
        {
            if (tiffImage == null)
            {
                Console.WriteLine("Unable to open TIFF file.");
                return;
            }

            FrameDimension frameDimension = new FrameDimension(tiffImage.FrameDimensionsList[0]);
            int frameCount = tiffImage.GetFrameCount(frameDimension);

            for (int frameIndex = 0; frameIndex < frameCount; frameIndex++)
            {
                tiffImage.SelectActiveFrame(frameDimension, frameIndex);

                using (Image frameImage = new Bitmap(tiffImage))
                {
                    // 保存帧图片
                    string outputFileName = $"frame_{frameIndex + 1}.png";
                    string outputPath = Path.Combine(outputFolderPath, outputFileName);
                    frameImage.Save(outputPath, ImageFormat.Png);

                    Console.WriteLine($"Frame {frameIndex + 1} saved to {outputPath}");
                }
            }
        }
    }
}

在这个示例中,我们首先使用 Image.FromFile 方法加载 TIFF 文件,然后获取 TIFF 文件的帧数。接着,我们循环遍历每个帧,使用 SelectActiveFrame 方法选择当前帧,然后将其转换为 System.Drawing.Image 对象,并保存为 PNG 格式的图像文件。

但是对于大TIF文件通过Image来拆分很容易报错:

System.Runtime.InteropServices.ExternalException:“GDI+ 中发生一般性错误。”

顾通过NUGET查找第三方插件BitMiracle来实现该功能。

3、通过BitMiracle来拆分

首先,你需要安装 BitMiracle 库,你可以从它的 GitHub 仓库 或者 NuGet 包 中获取。

image-ycio.png

BitMiracle 使用 Tiff 类来读取 TIF 文件。下面是一个简单的示例代码,演示如何使用 Tiff 类读取 TIF 文件的每个帧:

using System;
using BitMiracle.LibTiff.Classic;

string inputFilePath = "路径\\到\\你的\\文件.tif";
using (Tiff image = Tiff.Open(inputFilePath, "r"))
{
    if (image == null)
    {
        Console.WriteLine("Unable to open TIFF file.");
        return;
    }

    int frameCount = image.NumberOfDirectories();

    for (int frameIndex = 0; frameIndex < frameCount; frameIndex++)
    {
        // 设置当前拆解的图片帧
        image.SetDirectory((short)frameIndex);

        int width = image.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();
        int height = image.GetField(TiffTag.IMAGELENGTH)[0].ToInt();

        var raster = new int[height * width];
        if (!image.ReadRGBAImage(width, height, raster))
        {
            return;
        }

        var bmp = new Bitmap(width, height, PixelFormat.Format32bppRgb);

        var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);

        BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
        var bits = new byte[bmpdata.Stride * bmpdata.Height];

        //矩阵rgba转换
        for (int y = 0; y < bmp.Height; y++)
        {
            int rasterOffset = y * bmp.Width;
            int bitsOffset = (bmp.Height - y - 1) * bmpdata.Stride;

            for (int x = 0; x < bmp.Width; x++)
            {
                int rgba = raster[rasterOffset++];
                bits[bitsOffset++] = (byte)((rgba >> 16) & 0xff);
                bits[bitsOffset++] = (byte)((rgba >> 8) & 0xff);
                bits[bitsOffset++] = (byte)(rgba & 0xff);
                bits[bitsOffset++] = (byte)((rgba >> 24) & 0xff);
            }
        }

        System.Runtime.InteropServices.Marshal.Copy(bits, 0, bmpdata.Scan0, bits.Length);
        bmp.UnlockBits(bmpdata);

        string outputFileName = $"output_{frameIndex}.jpg"; // 输出文件名
        string outputPath = System.IO.Path.Combine(outputFolderPath, outputFileName);
        bmp.Save(outputPath, System.Drawing.Imaging.ImageFormat.Jpeg); // 保存当前页为BMP格式
    }
}

在上述示例中,我们首先使用 Tiff.Open 方法打开了一个 TIFF 文件,然后使用 NumberOfDirectories 方法获取了 TIFF 文件的帧数。接着,我们使用 SetDirectory 方法设置了当前处理的 TIFF 目录,并使用 GetField 方法获取了 TIFF 文件的宽度和高度。最后,我们使用 ReadRGBAImage 方法读取了 RGBA 图像数据,并进行了保存。

4、结论

在本文中,我们介绍了如何使用 BitMiracle 库来读取 TIF 文件的每个帧,并将其保存为 Image 图像。你可以根据实际需求对图像数据进行处理,并选择合适的保存格式。BitMiracle 提供了强大的功能来处理 TIFF 文件,为图像处理提供了很多便利。

0

评论区