首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 將多張圖片合併為多頁 TIFF 檔案完整實作

     編輯:關於C#

功能概述

將多張單頁圖片(JPG、PNG、BMP 等)合併成一個多頁 TIFF 檔案,常用於文件歸檔、傳真傳輸、醫療影像存儲等場景。本文提供完整可用的 SaveMultipage 方法,支援單頁與多頁自動切換,並採用無損壓縮。

核心程式碼實作

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

public bool SaveMultipage(Image[] images, string filePath, string format)
{
    if (images == null || images.Length == 0) return false;

    try
    {
        // 刪除既有檔案避免 GDI+ 存取錯誤
        if (File.Exists(filePath)) File.Delete(filePath);

        var codec = GetEncoderInfo(format);
        if (codec == null) throw new NotSupportedException($"不支援的格式: {format}");

        EncoderParameters encoderParams;

        if (images.Length == 1)
        {
            // 單頁模式:無壓縮儲存
            encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);
            images[0].Save(filePath, codec, encoderParams);
        }
        else
        {
            // 多頁模式:第一頁設定 MultiFrame
            encoderParams = new EncoderParameters(2);
            encoderParams.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
            encoderParams.Param[1] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);
            images[0].Save(filePath, codec, encoderParams);

            // 後續頁面:FrameDimensionPage
            encoderParams.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
            for (int i = 1; i < images.Length; i++)
            {
                if (images[i] == null) break;
                images[0].SaveAdd(images[i], encoderParams);
            }

            // 結束多頁儲存
            encoderParams.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush);
            images[0].SaveAdd(encoderParams);
        }
        return true;
    }
    catch (Exception ex)
    {
        throw new Exception($"多頁 TIFF 儲存失敗: {ex.Message}", ex);
    }
}

private ImageCodecInfo GetEncoderInfo(string mimeOrFormat)
{
    foreach (var codec in ImageCodecInfo.GetImageEncoders())
    {
        if (codec.FormatDescription.Equals(mimeOrFormat, StringComparison.OrdinalIgnoreCase) ||
            codec.MimeType.Equals(mimeOrFormat, StringComparison.OrdinalIgnoreCase))
            return codec;
    }
    return null;
}

單元測試範例

[TestMethod]
public void Multiple_Image_Into_1Tiff_With_MultiplePages()
{
    // 多圖測試
    const string multiPath = @"C:\Users\Public\Pictures\Sample Pictures";
    var files = new DirectoryInfo(multiPath).GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
    Assert.IsTrue(files.Length > 1);

    var images = files.Select(f => Image.FromFile(f.FullName)).ToArray();
    SaveMultipage(images, @"C:\multiplePageTiff.tiff", "TIFF");

    // 單圖測試
    const string singlePath = @"C:\Users\{your_pc_name}\Pictures\SingleImg";
    files = new DirectoryInfo(singlePath).GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
    Assert.IsTrue(files.Length == 1);

    images = files.Select(f => Image.FromFile(f.FullName)).ToArray();
    SaveMultipage(images, @"C:\multiplePageTiff_Single.tiff", "TIFF");
}

關鍵技術點解析

  • Encoder.SaveFlag:控制 TIFF 多頁儲存狀態機(MultiFrame 開始、FrameDimensionPage 追加、Flush 結束)。
  • Encoder.Compression:此處使用 CompressionNone 確保無損;若需壓縮可改用 CompressionCCITT4(黑白)或 CompressionLZW。
  • 資源管理: 測試程式碼中 Image.FromFile 產生的影像物件需在測試結束後手動 Dispose(),正式專案建議搭配 using 區塊。

效果展示

第二頁:

第三頁:

參考資源

原文連結:https://www.bianceng.cn/Programming/csharp/201410/45752.htm

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved