需將多張截圖、照片或掃描頁面拼成一張長圖(垂直)或寬圖(水平),常見於報表輸出、聊天記錄合併、全景圖拼接等需求。
public enum ImageMergeOrientation
{
Horizontal, // 水平拼接:寬度累加,高度取最大
Vertical // 垂直拼接:高度累加,寬度取最大
}
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
private void CombineImages(FileInfo[] files, string outputPath, ImageMergeOrientation orientation = ImageMergeOrientation.Vertical)
{
if (files == null || files.Length == 0) return;
// 先載入所有影像計算總尺寸
var images = files.Select(f => Image.FromFile(f.FullName)).ToArray();
int totalWidth = orientation == ImageMergeOrientation.Horizontal
? images.Sum(img => img.Width)
: images.Max(img => img.Width);
int totalHeight = orientation == ImageMergeOrientation.Vertical
? images.Sum(img => img.Height)
: images.Max(img => img.Height);
// 建立畫布
using (var finalBitmap = new Bitmap(totalWidth, totalHeight))
using (var g = Graphics.FromImage(finalBitmap))
{
g.Clear(SystemColors.AppWorkspace); // 背景色
int x = 0, y = 0;
foreach (var img in images)
{
g.DrawImage(img, new Point(x, y));
if (orientation == ImageMergeOrientation.Horizontal)
x += img.Width;
else
y += img.Height;
img.Dispose(); // 釋放來源影像資源
}
// 統一輸出為 TIFF(可依需求改為 PNG/JPEG)
finalBitmap.Save(outputPath, ImageFormat.Tiff);
}
}
| 方向 | 畫布寬度 | 畫布高度 | 拼貼座標遞增 |
|---|---|---|---|
| 水平 | 所有影像寬度總和 | 最大影像高度 | X 軸累加 |
| 垂直 | 最大影像寬度 | 所有影像高度總和 | Y 軸累加 |
較小的影像會靠左上角對齊,空白區域以 AppWorkspace 填充;若需置中或其他對齊方式,可自行調整 DrawImage 座標計算。
[TestMethod]
public void Combine_Multiple_SampleImages_IntoOne()
{
const string folder = @"C:\Users\Public\Pictures\Sample Pictures";
var files = new DirectoryInfo(folder).GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
CombineImages(files, @"C:\FinalImage_H.tiff", ImageMergeOrientation.Horizontal);
CombineImages(files, @"C:\FinalImage_V.tiff", ImageMergeOrientation.Vertical);
}
縱向合併:

橫向合併:

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