將多張單頁圖片(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");
}
MultiFrame 開始、FrameDimensionPage 追加、Flush 結束)。CompressionNone 確保無損;若需壓縮可改用 CompressionCCITT4(黑白)或 CompressionLZW。Image.FromFile 產生的影像物件需在測試結束後手動 Dispose(),正式專案建議搭配 using 區塊。第二頁:

第三頁:

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