첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
3.97MB

▶ 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
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요