안녕하세요 엘라입니다 (●'◡'●)
저는 요즘 아주 바쁜 나날을 보내고 있습니다.
그 와중에 감기도 지독하게 걸려서 한창 고생했다가, 제가 남자친구한테 옮겨서 이제는 오빠가 골골대고 있습니다.
다들 감기 조심하세요... (코로나는 절대 안 걸리는 1인..😂ㅋㅋㅋ)
오늘은 이미지 합치기 프로그램을 만들어봤습니다.
요즘은 온라인에서 무료로 이미지 파일 확장자 변환 프로그램도 있고,
무료로 여러개 이미지를 합쳐주는 프로그램도 있는데요,
제가 최근에 이미지 합치기를 자주 쓰게 돼서 한 번 만들어 봤습니다.
Winform UI는 아래와 같이 만들었습니다.
세로 방향으로 합칠건지, 가로 방향으로 합칠 건지 선택하고,
여백이 없도록 이미지 사이즈가 작으면 자동으로 사이즈를 변경해 줄 것인지도 선택하도록 했습니다.
이미지는 Drag and Drop으로 바로 넣을 수 있도록 했습니다.
아래의 이전 포스팅을 참고하시면 되는데,
해당 포스팅에는 확장자명으로 구분하여 엑셀파일만 불러오게 했었고,
이번에는 이미지 파일만 불러오도록 변경하면 됩니다.
2023.01.13 - [IT/C#] - [C#] Drag and Drop으로 Winform에 파일 넣기
이미지 넣고, Horizontal 방향으로 Merge 한 이미지 미리 보기. (feat. 우리 은우❤)
버튼 클릭 이벤트 전체 소스는 아래에 있습니다.
코드 설명은 다음과 같습니다.
1. SaveFileDialog를 통해 이미지 저장 경로를 지정하고 Merge Process를 시작합니다.
2. ListView에 넣은 이미지를 Bitmap Array에 넣어주고,
3. Merge Image의 width, height 사이즈를 계산하기 위해, Vertical/Horizontal 선택에 따라 이미지에서 Width/Height Max 값을 구하고, 나머지 Height/Width Sum 값을 구합니다.
3-1. 3번째 과정에서 Auto Resize 체크에 따라 Width/Height Max 값을 토대로 작은 이미지는 사이즈를 변경해 줍니다.
3-2. Width를 Max 값으로 변경해 주는 경우, Height 값은 원래 이미지 비율에 맞게 계산해서 변경해 줍니다.
Height = bmps.height * Max Width / bmps.width
4. 마지막으로 이미지를 순서대로 mergeImage에 그려주고, 지정된 경로에 저장합니다.
(+ 230210 소스코드 일부분 오류 수정 완료)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
private void btnMergeImage_Click(object sender, EventArgs e)
{
try
{
if (listView1.Items.Count > 0)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "JPG files (*.jpg)|*.jpg|Bitmap files (*.bmp)|*.bmp|PNG files (*.png)|*.png|All files (*.*)|*.*";
if (sfd.ShowDialog() == DialogResult.OK)
{
Bitmap[] bmps = new Bitmap[listView1.Items.Count];
for (int i = 0; i < listView1.Items.Count; i++)
{
bmps[i] = new Bitmap(listView1.Items[i].SubItems[2].Text);
}
Bitmap mergeImage;
List<int> calWidth = new List<int>();
List<int> calHeight = new List<int>();
int width, height;
if (rbVertical.Checked)
{
foreach (var item in bmps)
{
calWidth.Add(item.Width);
}
width = calWidth.Max();
if (chkAutoResize.Checked)
{
for (int i = 0; i < calWidth.Count; i++)
{
if (bmps[i].Width < width)
{
int h = Convert.ToInt32(bmps[i].Height * width / bmps[i].Width);
bmps[i] = resizeImage(bmps[i], new Size(width, h));
}
}
}
foreach (var item in bmps)
{
calHeight.Add(item.Height);
}
height = calHeight.Sum();
mergeImage = new Bitmap(width, height);
int beforeHeight = 0;
using (Graphics g = Graphics.FromImage(mergeImage))
{
g.Clear(Color.Black);
for (int i = 0; i < listView1.Items.Count; i++)
{
if (i != 0) beforeHeight += bmps[i - 1].Height;
g.DrawImage(bmps[i], 0, beforeHeight, bmps[i].Width, bmps[i].Height);
}
}
}
else
{
foreach (var item in bmps)
{
calHeight.Add(item.Height);
}
height = calHeight.Max();
if (chkAutoResize.Checked)
{
for (int i = 0; i < calHeight.Count; i++)
{
if (bmps[i].Height < height)
{
int w = Convert.ToInt32(bmps[i].Width * height / bmps[i].Height);
bmps[i] = resizeImage(bmps[i], new Size(w, height));
}
}
}
foreach (var item in bmps)
{
calWidth.Add(item.Width);
}
width = calWidth.Sum();
mergeImage = new Bitmap(width, height);
int beforeWidth = 0;
using (Graphics g = Graphics.FromImage(mergeImage))
{
g.Clear(Color.Black);
for (int i = 0; i < listView1.Items.Count; i++)
{
if (i != 0) beforeWidth += bmps[i - 1].Width;
g.DrawImage(bmps[i], beforeWidth, 0, bmps[i].Width, bmps[i].Height);
}
}
}
mergeImage.Save(sfd.FileName);
mergeImage.Dispose();
}
MessageBox.Show("Image Saved.");
} else
{
MessageBox.Show("Load Image then Try Again.");
}
}
catch (Exception ex)
{
MessageBox.Show("Image Save Failed. : " + ex.ToString());
}
}
|
cs |
코드 설명을 따라가면서 확인해 보시면 이해가 가실 거라 생각됩니다.
혹시 궁금한 점이 있으시면 아래 댓글로 남겨주시기 바라며,
다음에도 유익한 포스팅으로 돌아오겠습니다 ㅎㅎ : )
'IT > C#' 카테고리의 다른 글
[C#] 숫자만 입력 가능한 텍스트박스 구현 방법 2가지! (12) | 2023.03.07 |
---|---|
[C#] Tooltip & ContextMenuStrip 간단 설명 및 예시 (2) | 2023.02.23 |
[C#] Math Class 주로 쓰이는 Method 정리 (0) | 2023.02.03 |
[C#] Excel Data to DataGridView with OleDB (2) | 2023.01.13 |
[C#] Drag and Drop으로 Winform에 파일 넣기 (0) | 2023.01.13 |