多幀影像指單一檔案包含多個畫面,支援格式僅 TIFF 與 GIF。GDI+ 可生成多頁 TIFF,但無法原生生成 GIF 動畫(疑因專利限制)。
public void CreateMultiframeTIFF(string resultImage, string image1, params string[] images)
{
Image frame1 = Image.FromFile(image1);
int len = images.Length;
Image[] frames = new Image[len];
for (int i = 0; i < len; i++) frames[i] = Image.FromFile(images[i]);
Bitmap bmpResult = (Bitmap)frame1;
EncoderParameters ep = new EncoderParameters(1);
ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
// 尋找 TIFF 編碼器
var codecs = new List<ImageCodecInfo>(ImageCodecInfo.GetImageEncoders());
ImageCodecInfo tiffCodec = codecs.Find(c => c.MimeType.Equals("image/tiff", StringComparison.OrdinalIgnoreCase));
// 儲存第一幀
bmpResult.Save(resultImage, tiffCodec, ep);
// 追加後續幀
ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
foreach (Image frame in frames) bmpResult.SaveAdd(frame, ep);
// 刷新流
ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush);
bmpResult.SaveAdd(ep);
// 釋放資源
frame1.Dispose();
foreach (Image f in frames) f.Dispose();
bmpResult.Dispose();
}
// TIFF 使用 FrameDimension.Page
int count = bmp.GetFrameCount(FrameDimension.Page);
bmp.SelectActiveFrame(FrameDimension.Page, 1); // 選取第 2 幀
// GIF 動畫使用 FrameDimension.Time
int count = bmp.GetFrameCount(FrameDimension.Time);
bmp.SelectActiveFrame(FrameDimension.Time, 1);
GIF 動畫生成雖無內建方法,但可透過底層實現(待後續機會分享)。