お気に入りの写真を複数つなぎあわせて新しい画像をつくる。C#ではどうやればいいのでしょうか?
ふたつの画像を横に並べる方法。
まずふたつのファイルからImageを取得。そしてBitmapをつくります。大きさは幅はふたつの合計、高さはふたつのうち大きい方を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { string path1 = textBox1.Text; string path2 = textBox2.Text; Image img1 = Image.FromFile(path1); Image img2 = Image.FromFile(path2); int width = img1.Width + img2.Width; int height = img1.Height > img2.Height ? img1.Height : img2.Height; Bitmap bmp = new Bitmap(width, height); Graphics g = Graphics.FromImage(bmp); g.DrawImage(img1, new Point(0, 0)); g.DrawImage(img2, new Point(img1.Width, 0)); g.Dispose(); img1.Dispose(); img2.Dispose(); bmp.Save(@"D:\003.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); bmp.Dispose(); } } |
これで二つの写真を合成することができますが、ふたつの写真の高さが違うとちょっとうまくいきません。サイズが小さいほうの下側に黒い部分ができてしまいます。
高さをそろえる必要があります。これにともなって幅も変更する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { string path1 = textBox1.Text; string path2 = textBox2.Text; Image img1 = Image.FromFile(path1); Image img2 = Image.FromFile(path2); int width = img1.Width + img2.Width; int height = img1.Height > img2.Height ? img1.Height : img2.Height; int newHeight1 = img1.Height * height / img1.Height; int newWidth1 = img1.Width * height / img1.Height; Rectangle rect1 = new Rectangle(0, 0, newWidth1, newHeight1); int newHeight2 = img2.Height * height / img2.Height; int newWidth2 = img2.Width * height / img2.Height; Rectangle rect2 = new Rectangle(newWidth1, 0, newWidth2, newHeight2); Bitmap bmp = new Bitmap(newWidth1 + newWidth2, height); Graphics g = Graphics.FromImage(bmp); g.DrawImage(img1, new Rectangle(0,0, newWidth1, newHeight1)); g.DrawImage(img2, new Rectangle(newWidth1, 0, newWidth2, newHeight2)); g.Dispose(); img1.Dispose(); img2.Dispose(); bmp.Save(@"D:\003.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); bmp.Dispose(); } } |
これならうまくできます。
これなら横にいくつでもつなげることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public partial class Form1 : Form { Bitmap ArrangeImage(string[] paths) { List<Image> images = new List<Image>(); foreach(var path in paths) { images.Add(Image.FromFile(path)); } int maxHieght = images.Max(x => x.Height); List<Rectangle> rects = new List<Rectangle>(); int px = 0; foreach (var img in images) { int newHeight = img.Height * maxHieght / img.Height; int newWidth = img.Width * maxHieght / img.Height; rects.Add(new Rectangle(px, 0, newWidth, newHeight)); px += newWidth; } int width = rects.Sum(x => x.Width); Bitmap bmp = new Bitmap(width, maxHieght); Graphics g = Graphics.FromImage(bmp); for (int i = 0; i < rects.Count; i++) { g.DrawImage(images[i], rects[i]); } g.Dispose(); foreach (var img in images) { img.Dispose(); } return bmp; } private void button1_Click(object sender, EventArgs e) { List<string> paths = new List<string>(); paths.Add(textBox1.Text); paths.Add(textBox2.Text); paths.Add(textBox3.Text); try { Bitmap bmp = ArrangeImage(paths.ToArray()); bmp.Save(@"D:\output.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); bmp.Dispose(); } catch { MessageBox.Show("失敗しました"); } } } |