画像の結合は画像の一部領域の切り出しで行った方法とよく似ています。
処理の手順は
- 結合後の大きさと同じ大きさのBitmapオブジェクトの作成
- BitmapオブジェクトからGraphicsオブジェクトの作成
- 作成したGraphicsオブジェクトへ描画先を指定して描画
画像を縦方向に結合する例をメソッドにまとめました。
/// <summary>
/// 画像を縦に結合する
/// </summary>
/// <param name="src">結合するBitmapの配列</param>
/// <returns>結合されたBitmapオブジェクト</returns>
public Bitmap ImageCombineV(Bitmap[] src)
{
// 結合後のサイズを計算
int dstWidth = 0, dstHeight = 0;
System.Drawing.Imaging.PixelFormat dstPixelFormat = System.Drawing.Imaging.PixelFormat.Format8bppIndexed;
for (int i = 0; i < src.Length; i++)
{
if (dstWidth < src[i].Width) dstWidth = src[i].Width;
dstHeight += src[i].Height;
// 最大のビット数を検索
if (Bitmap.GetPixelFormatSize(dstPixelFormat)
< Bitmap.GetPixelFormatSize(src[i].PixelFormat))
{
dstPixelFormat = src[i].PixelFormat;
}
}
var dst = new Bitmap(dstWidth, dstHeight, dstPixelFormat);
var dstRect = new Rectangle();
using (var g = Graphics.FromImage(dst)) {
for (int i = 0; i < src.Length; i++)
{
dstRect.Width = src[i].Width;
dstRect.Height = src[i].Height;
// 描画
g.DrawImage(src[i], dstRect, 0, 0, src[i].Width, src[i].Height, GraphicsUnit.Pixel);
// 次の描画先
dstRect.Y = dstRect.Bottom;
}
}
return dst;
}
使用方法は
var images = new Bitmap[] {
new Bitmap("Lenna.bmp"),
new Bitmap("Mandrill.bmp"),
new Bitmap("Parrots.bmp")
};
// 画像の結合
var combinedImage = ImageCombineV(images);
// 結合画像の保存
combinedImage.Save("combinedImage.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
// 解放
foreach (var bmp in images)
{
bmp.Dispose();
}
のような感じで。
←画像処理のためのC#テクニックへ戻る