728x90
반응형
728x170
▶ ImageHelper.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace TestProject
{
/// <summary>
/// 이미지 헬퍼
/// </summary>
public static class ImageHelper
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 이미지 코덱 정보 딕셔너리
/// </summary>
private static Dictionary<string, ImageCodecInfo> _imageCodecInfoDictionary = null;
/// <summary>
/// 이미지 코텍 정보 딕셔너리 잠금
/// </summary>
private static object _imageCodecInfoDictionaryLock = new object();
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 이미지 코덱 정보 딕셔너리 - ImageCodecInfoDictionary
/// <summary>
/// 이미지 코덱 정보 딕셔너리
/// </summary>
public static Dictionary<string, ImageCodecInfo> ImageCodecInfoDictionary
{
get
{
if(_imageCodecInfoDictionary == null)
{
lock(_imageCodecInfoDictionaryLock)
{
if(_imageCodecInfoDictionary == null)
{
_imageCodecInfoDictionary = new Dictionary<string, ImageCodecInfo>();
foreach(ImageCodecInfo codecInfo in ImageCodecInfo.GetImageEncoders())
{
_imageCodecInfoDictionary.Add(codecInfo.MimeType.ToLower(), codecInfo);
}
}
}
}
return _imageCodecInfoDictionary;
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 이미지 크기 변경하기 - ResizeImage(sourceImage, width, height)
/// <summary>
/// 이미지 크기 변경하기
/// </summary>
/// <param name="sourceImage">소스 이미지</param>
/// <param name="width">너비</param>
/// <param name="height">높이</param>
/// <returns>이미지</returns>
public static Bitmap ResizeImage(Image sourceImage, int width, int height)
{
Bitmap targetBitmap = new Bitmap(width, height);
targetBitmap.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
using(Graphics graphics = Graphics.FromImage(targetBitmap))
{
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.DrawImage(sourceImage, 0, 0, targetBitmap.Width, targetBitmap.Height);
}
return targetBitmap;
}
#endregion
#region 이미지 코덱 정보 구하기 - GetImageCodecInfo(mimeType)
/// <summary>
/// 이미지 코덱 정보 구하기
/// </summary>
/// <param name="mimeType">MIME 타입</param>
/// <returns>이미지 코텍 정보</returns>
public static ImageCodecInfo GetImageCodecInfo(string mimeType)
{
string lookupKey = mimeType.ToLower();
ImageCodecInfo codecInfo = null;
if(ImageCodecInfoDictionary.ContainsKey(lookupKey))
{
codecInfo = ImageCodecInfoDictionary[lookupKey];
}
return codecInfo;
}
#endregion
#region JPEG 저장하기 - SaveJPEG(filePath, sourceImage, quality)
/// <summary>
/// JPEG 저장하기
/// </summary>
/// <param name="filePath">파일 경로</param>
/// <param name="sourceImage">소스 이미지</param>
/// <param name="quality">품질</param>
public static void SaveJPEG(string filePath, Image sourceImage, int quality)
{
if((quality < 0) || (quality > 100))
{
string error = string.Format
(
"Jpeg image quality must be between 0 and 100, with 100 being the highest quality. A value of {0} was specified.",
quality
);
throw new ArgumentOutOfRangeException(error);
}
EncoderParameter parameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
ImageCodecInfo codecInfo = GetImageCodecInfo("image/jpeg");
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = parameter;
sourceImage.Save(filePath, codecInfo, parameters);
}
#endregion
}
}
728x90
▶ MainForm.cs
using System;
using System.Drawing;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.sourcePictureBox.Image = Properties.Resources.source;
this.sourcePictureBox.Size = Properties.Resources.source.Size;
this.resizeButton.Click += resizeButton_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 이미지 크기 변경하기 버튼 클릭시 처리하기 - resizeButton_Click(sender, e)
/// <summary>
/// 이미지 크기 변경하기 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void resizeButton_Click(object sender, EventArgs e)
{
if(this.targetPictureBox.Image == null)
{
int targetWidth = 300;
double factor = (double)targetWidth / this.sourcePictureBox.Image.Width;
int targetHeight = (int)(this.sourcePictureBox.Image.Height * factor);
Image targetImage = ImageHelper.ResizeImage(this.sourcePictureBox.Image, targetWidth, targetHeight);
this.targetPictureBox.Image = targetImage;
this.targetPictureBox.Size = targetImage.Size;
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM/.NET6] Point 클래스 : 다각형 내부 위치 여부 구하기 (0) | 2022.08.20 |
---|---|
[C#/WINFORM/.NET6] Point 클래스 : 다각형 내부 위치 여부 구하기 (0) | 2022.08.20 |
[C#/WINFORM/.NET6] Point 클래스 : 다각형 내부 위치 여부 구하기 (0) | 2022.08.20 |
[C#/WINFORM/.NET6] Point 클래스 : 다각형 내부 위치 여부 구하기 (0) | 2022.08.20 |
[C#/WINFORM] ListView 클래스 : RetrieveVirtualItem 이벤트를 사용해 대용량 데이터 조회하기 (0) | 2022.07.20 |
[C#/WINFORM/.NET6] FontFamily 클래스 : GenericMonospace 정적 속성을 사용해 고정 폭 폰트 만들기 (0) | 2022.07.04 |
[C#/WINFORM/.NET6] Application 클래스 : ProductVersion 정적 속성을 사용해 프로그램 버전 구하기 (0) | 2022.06.21 |
[C#/WINFORM/.NET6] SoundPlayer 클래스 : PlaySync 메소드를 사용해 비프음 만들기 (0) | 2022.06.10 |
[C#/WINFORM] 저수준 키보드 후킹하기 (0) | 2022.05.25 |
[C#/WINFORM] 멀티미디어 타이머 사용하기 (0) | 2022.05.25 |
댓글을 달아 주세요