728x90
반응형
728x170
▶ MainForm.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 포인트 리스트 리스트
/// </summary>
private List<List<Point>> pointListList = new List<List<Point>>();
/// <summary>
/// 신규 포인트 리스트
/// </summary>
private List<Point> newPointList = null;
/// <summary>
/// 펜
/// </summary>
private Pen pen = new Pen(Color.FromArgb(128, 0, 0, 255), 5);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.newMenuItem.Click += newMenuItem_Click;
this.loadBackgroundImageMenuItem.Click += loadBackgroundImageMenuItem_Click;
this.saveMenuItem.Click += saveMenuItem_Click;
this.exitMenuItem.Click += exitMenuItem_Click;
this.pictureBox.MouseDown += pictureBox_MouseDown;
this.pictureBox.MouseMove += pictureBox_MouseMove;
this.pictureBox.MouseUp += pictureBox_MouseUp;
this.pictureBox.Paint += pictureBox_Paint;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 새 그림 메뉴 항목 클릭시 처리하기 - newMenuItem_Click(sender, e)
/// <summary>
/// 새 그림 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void newMenuItem_Click(object sender, EventArgs e)
{
this.pointListList = new List<List<Point>>();
this.pictureBox.Image = null;
this.pictureBox.Refresh();
}
#endregion
#region 배경 이미지 로드 메뉴 항목 클릭시 처리하기 - loadBackgroundImageMenuItem_Click(sender, e)
/// <summary>
/// 배경 이미지 로드 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void loadBackgroundImageMenuItem_Click(object sender, EventArgs e)
{
if(this.openFileDialog.ShowDialog() == DialogResult.OK)
{
this.pictureBox.Image = GetBitmap(this.openFileDialog.FileName);
}
}
#endregion
#region 저장 메뉴 항목 클릭시 처리하기 - saveMenuItem_Click(sender, e)
/// <summary>
/// 저장 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void saveMenuItem_Click(object sender, EventArgs e)
{
if(this.saveFileDialog.ShowDialog() == DialogResult.OK)
{
Bitmap bitmap = GetBitmap(this.pictureBox);
SaveImage(bitmap, this.saveFileDialog.FileName);
}
}
#endregion
#region 종료 메뉴 항목 클릭시 처리하기 - exitMenuItem_Click(sender, e)
/// <summary>
/// 종료 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void exitMenuItem_Click(object sender, EventArgs e)
{
Close();
}
#endregion
#region 픽처 박스 마우스 DOWN 처리하기 - pictureBox_MouseDown(sender, e)
/// <summary>
/// 픽처 박스 마우스 DOWN 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
this.newPointList = new List<Point>();
this.pointListList.Add(this.newPointList);
this.newPointList.Add(e.Location);
}
#endregion
#region 픽처 박스 마우스 이동시 처리하기 - pictureBox_MouseMove(sender, e)
/// <summary>
/// 픽처 박스 마우스 이동시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
if(this.newPointList == null)
{
return;
}
this.newPointList.Add(e.Location);
this.pictureBox.Refresh();
}
#endregion
#region 픽처 박스 마우스 UP 처리하기 - pictureBox_MouseUp(sender, e)
/// <summary>
/// 픽처 박스 마우스 UP 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
if(this.newPointList == null)
{
return;
}
if(this.newPointList.Count < 2)
{
this.pointListList.RemoveAt(this.pointListList.Count - 1);
}
this.newPointList = null;
this.pictureBox.Refresh();
}
#endregion
#region 픽처 박스 페인트시 처리하기 - pictureBox_Paint(sender, e)
/// <summary>
/// 픽처 박스 페인트시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void pictureBox_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
foreach(List<Point> pointList in this.pointListList)
{
e.Graphics.DrawLines(this.pen, pointList.ToArray());
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 비트맵 구하기 - GetBitmap(filePath)
/// <summary>
/// 비트맵 구하기
/// </summary>
/// <param name="filePath">파일 경로</param>
/// <returns>비트맵</returns>
private Bitmap GetBitmap(string filePath)
{
using(Bitmap bitmap = new Bitmap(filePath))
{
return new Bitmap(bitmap);
}
}
#endregion
#region 비트맵 구하기 - GetBitmap(control)
/// <summary>
/// 비트맵 구하기
/// </summary>
/// <param name="control">컨트롤</param>
/// <returns>비트맵</returns>
private Bitmap GetBitmap(Control control)
{
Bitmap bitmap = new Bitmap(control.Width, control.Height);
control.DrawToBitmap
(
bitmap,
new Rectangle(0, 0, control.Width, control.Height)
);
return bitmap;
}
#endregion
#region 이미지 저장하기 - SaveImage(image, filePath)
/// <summary>
/// 이미지 저장하기
/// </summary>
/// <param name="image">이미지</param>
/// <param name="filePath">파일 경로</param>
public void SaveImage(Image image, string filePath)
{
string fileExtension = Path.GetExtension(filePath);
switch(fileExtension.ToLower())
{
case ".bmp" : image.Save(filePath, ImageFormat.Bmp ); break;
case ".exif" : image.Save(filePath, ImageFormat.Exif); break;
case ".gif" : image.Save(filePath, ImageFormat.Gif ); break;
case ".jpg" :
case ".jpeg" : image.Save(filePath, ImageFormat.Jpeg); break;
case ".png" : image.Save(filePath, ImageFormat.Png ); break;
case ".tif" :
case ".tiff" : image.Save(filePath, ImageFormat.Tiff); break;
default : throw new NotSupportedException($"Unknown file extension : {fileExtension}");
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] 윈도우 텍스트 구하기 (0) | 2021.04.07 |
---|---|
[C#/WINFORM] 윈도우 위치/크기/상태 구하기 (0) | 2021.04.07 |
[C#/WINFORM] SendKeys 클래스 : 키 코드 사용하기 (0) | 2021.04.03 |
[C#/WINFORM] SendKeys 클래스 : SendWait 정적 메소드를 사용해 ESC 키 누르기 (0) | 2021.04.03 |
[C#/WINFORM] k-평균 클러스터링(k-means clustering) 사용하기 (0) | 2021.03.11 |
[C#/WINFORM] PictureBox 클래스 : 배경 이미지 위에 낙서하기 (0) | 2021.03.10 |
[C#/WINFORM] Bitmap 클래스 : 오버레이 비트맵 혼합하기 (0) | 2021.03.09 |
[C#/WINFORM] Bitmap 클래스 : 색상 대체하기 (0) | 2021.03.08 |
[C#/WINFORM] Bitmap 클래스 : ARGB 색상 채널 교환하기 (0) | 2021.03.08 |
[C#/WINFORM] Bitmap 클래스 : 부분 색상 반전하기 (0) | 2021.02.24 |
[C#/WINFORM] Bitmap 클래스 : 색상 균형 필터(Color Balance Filter) 사용하기 (0) | 2021.02.24 |
댓글을 달아 주세요