728x90
반응형
728x170
▶ SVGParser.cs
using System.Drawing;
using Svg;
namespace TestProject
{
/// <summary>
/// SVG 파서
/// </summary>
public class SVGParser
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 최대 크기 - MaximumSize
/// <summary>
/// 최대 크기
/// </summary>
public static Size MaximumSize { get; set; }
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region SVG 문서 구하기 - GetSVGDocument(filePath)
/// <summary>
/// SVG 문서 구하기
/// </summary>
/// <param name="filePath">파일 경로</param>
/// <returns>SVG 문서</returns>
public static SvgDocument GetSVGDocument(string filePath)
{
SvgDocument document = SvgDocument.Open(filePath);
return AdjustSize(document);
}
#endregion
#region 비트맵 구하기 - GetBitmap(filePath)
/// <summary>
/// 비트맵 구하기
/// </summary>
/// <param name="filePath">파일 경로</param>
/// <returns>비트맵</returns>
public static Bitmap GetBitmap(string filePath)
{
SvgDocument document = GetSVGDocument(filePath);
Bitmap bitmap = document.Draw();
return bitmap;
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Private
#region 크기 조정하기 - AdjustSize(document)
/// <summary>
/// 크기 조정하기
/// </summary>
/// <param name="document">SVG 문서</param>
/// <returns>SVG 문서</returns>
private static SvgDocument AdjustSize(SvgDocument document)
{
if(document.Height > MaximumSize.Height)
{
document.Width = (int)((document.Width / (double)document.Height) * MaximumSize.Height);
document.Height = MaximumSize.Height;
}
return document;
}
#endregion
}
}
728x90
▶ MainForm.cs
using System;
using System.Drawing;
using System.Windows.Forms;
using Svg;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 파일 경로
/// </summary>
private string filePath;
/// <summary>
/// SVG 문서
/// </summary>
private SvgDocument document;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.browseButton.Click += browseButton_Click;
this.sourceColorButton.Click += sourceColorButton_Click;
this.targetColorButton.Click += targetColorButton_Click;
this.pickColorCheckBox.CheckedChanged += pickColorCheckBox_CheckedChanged;
this.replaceColorButton.Click += replaceColorButton_Click;
this.scaleUpButton.Click += scaleUpButton_Click;
this.scaleDownButton.Click += scaleDownButton_Click;
this.pictureBox.MouseDown += pictureBox_MouseDown;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 파일 선택 버튼 클릭시 처리하기 - browseButton_Click(sender, e)
/// <summary>
/// 파일 선택 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void browseButton_Click(object sender, EventArgs e)
{
DialogResult result = openFileDialog.ShowDialog();
if(result == DialogResult.OK)
{
SVGParser.MaximumSize = new Size(this.pictureBox.Width, this.pictureBox.Height);
this.filePath = this.openFileDialog.FileName;
this.svgFilePathTextBox.Text = this.filePath;
this.document = SVGParser.GetSVGDocument(this.filePath);
this.widthTextBox.Text = this.document.Width.Value.ToString();
this.heightTextBox.Text = this.document.Height.Value.ToString();
this.pictureBox.Image = SVGParser.GetBitmap(this.filePath);
}
}
#endregion
#region 소스 색상 버튼 클릭시 처리하기 - sourceColorButton_Click(sender, e)
/// <summary>
/// 소스 색상 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void sourceColorButton_Click(object sender, EventArgs e)
{
DialogResult result = colorDialog.ShowDialog();
if(result == DialogResult.OK)
{
this.sourceColorButton.BackColor = this.colorDialog.Color;
}
}
#endregion
#region 색상 선택 체크 박스 체크 변경시 처리하기 - pickColorCheckBox_CheckedChanged(sender, e)
/// <summary>
/// 색상 선택 체크 박스 체크 변경시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void pickColorCheckBox_CheckedChanged(object sender, EventArgs e)
{
if(this.pickColorCheckBox.Checked)
{
this.pickColorCheckBox.BackColor = Color.LightPink;
this.pictureBox.Cursor = Cursors.Cross;
}
else
{
this.pickColorCheckBox.BackColor = Color.Gainsboro;
this.pictureBox.Cursor = Cursors.Default;
}
}
#endregion
#region 타겟 색상 버튼 클릭시 처리하기 - targetColorButton_Click(sender, e)
/// <summary>
/// 타겟 색상 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void targetColorButton_Click(object sender, EventArgs e)
{
DialogResult result = colorDialog.ShowDialog();
if(result == DialogResult.OK)
{
this.targetColorButton.BackColor = this.colorDialog.Color;
}
}
#endregion
#region 색상 대체 버튼 클릭시 처리하기 - replaceColorButton_Click(sender, e)
/// <summary>
/// 색상 대체 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void replaceColorButton_Click(object sender, EventArgs e)
{
if(!ValidateData())
{
return;
}
foreach(SvgElement element in this.document.Children)
{
ChangeColor(element, this.sourceColorButton.BackColor, this.targetColorButton.BackColor);
}
this.pictureBox.Image = this.document.Draw();
}
#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)
{
if(this.pickColorCheckBox.Checked)
{
if(!ValidateData())
{
return;
}
if(e.Button == MouseButtons.Left)
{
Bitmap bitmap = this.pictureBox.Image as Bitmap;
this.sourceColorButton.BackColor = bitmap.GetPixel(e.X, e.Y);
}
}
}
#endregion
#region 크기 감소 버튼 클릭시 처리하기 - scaleDownButton_Click(sender, e)
/// <summary>
/// 크기 감소 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void scaleDownButton_Click(object sender, EventArgs e)
{
if(!ValidateData())
{
return;
}
int width = int.Parse(this.widthTextBox.Text );
int height = int.Parse(this.heightTextBox.Text);
if(width - 10 > 0 && height- 10 > 0)
{
width -= 10;
this.widthTextBox.Text = width.ToString();
height -= 10;
this.heightTextBox.Text = height.ToString();
this.document.Width = width;
this.document.Height = height;
this.pictureBox.Image = this.document.Draw();
}
}
#endregion
#region 크기 증가 버튼 클릭시 처리하기 - scaleUpButton_Click(sender, e)
/// <summary>
/// 크기 증가 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void scaleUpButton_Click(object sender, EventArgs e)
{
if(!ValidateData())
{
return;
}
int width = int.Parse(this.widthTextBox.Text );
int height = int.Parse(this.heightTextBox.Text);
if(width + 10 < this.pictureBox.Width && height + 10 < this.pictureBox.Height)
{
width += 10;
this.widthTextBox.Text = width.ToString();
height += 10;
this.heightTextBox.Text = height.ToString();
this.document.Width = width;
this.document.Height = height;
this.pictureBox.Image = this.document.Draw();
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 데이터 검증하기 - ValidateData()
/// <summary>
/// 데이터 검증하기
/// </summary>
/// <returns>데이터 검증 결과</returns>
private bool ValidateData()
{
if(this.document == null || pictureBox.Image == null)
{
MessageBox.Show("SVG 이미지 파일을 선택해 주시기 바랍니다.");
return false;
}
return true;
}
#endregion
#region 색상 변경하기 - ChangeColor(element, sourceColor, targetColor)
/// <summary>
/// 색상 변경하기
/// </summary>
/// <param name="element">SVG 요소</param>
/// <param name="sourceColor">소스 색상</param>
/// <param name="targetColor">타겟 색상</param>
private void ChangeColor(SvgElement element, Color sourceColor, Color targetColor)
{
if(element is SvgPath)
{
if(((element as SvgPath).Fill as SvgColourServer).Colour.ToArgb() == sourceColor.ToArgb())
{
(element as SvgPath).Fill = new SvgColourServer(targetColor);
}
}
if(element.Children.Count > 0)
{
foreach(SvgElement child in element.Children)
{
ChangeColor(child, sourceColor, targetColor);
}
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] RichTextBox 클래스 : 테이블 추가하기 (0) | 2020.12.26 |
---|---|
[C#/WINFORM] RichTextBox 클래스 : 이미지 캡처하기 (0) | 2020.12.25 |
[C#/WINFORM] Bitmap 클래스 : 합성 이미지 만들기 (0) | 2020.12.25 |
[C#/WINFORM] 화면 보호기/절전 모드 방지하기/허용하기 (0) | 2020.12.21 |
[C#/WINFORM] Form 클래스 : CreateParams 속성을 사용해 작업 전환기(Tab Switcher)에서 애플리케이션 숨기기 (0) | 2020.12.19 |
[C#/WINFORM] 관리자 권한으로 실행하기 (0) | 2020.12.18 |
[C#/WINFORM] 화면 캡처 방지하기 (0) | 2020.12.17 |
[C#/WINFORM] Control 클래스 : WndProc 메소드를 사용해 데이터 수신하기 (0) | 2020.12.05 |
[C#/WINFORM] 특정 프로세스의 윈도우 핸들 구하기 (0) | 2020.12.05 |
[C#/WINFORM] 누겟 설치 : Microsoft.Windows.Shell (0) | 2020.11.17 |
댓글을 달아 주세요