첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ 특정 이미지 부분 제거하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


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<Point> pointList = null;

 

        /// <summary>

        /// 그리기 여부

        /// </summary>

        private bool isDrawing = false;

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            #region 이벤트를 설정한다.

 

            this.openMenuItem.Click            += openMenuItem_Click;

            this.saveAreaMenuItem.Click        += saveAreaMenuItem_Click;

            this.saveWithoutAreaMenuItem.Click += saveWithoutAreaMenuItem_Click;

            this.exitMenuItem.Click            += exitMenuItem_Click;

            this.sourcePictureBox.MouseDown    += sourcePictureBox_MouseDown;

            this.sourcePictureBox.MouseMove    += sourcePictureBox_MouseMove;

            this.sourcePictureBox.MouseUp      += sourcePictureBox_MouseUp;

            this.sourcePictureBox.Paint        += sourcePictureBox_Paint;

 

            #endregion

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        //////////////////////////////////////////////////////////////////////////////// Event

 

        #region 파일 열기 메뉴 항목 클릭시 처리하기 - openMenuItem_Click(sender, e)

 

        /// <summary>

        /// 파일 열기 메뉴 항목 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void openMenuItem_Click(object sender, EventArgs e)

        {

            if(this.openFileDialog.ShowDialog() == DialogResult.OK)

            {

                try

                {

                    this.sourcePictureBox.Image = GetBitmap(this.openFileDialog.FileName);

 

                    this.sourcePictureBox.Visible = true;

 

                    this.areaPictureBox.Image = null;

 

                    this.withoutAreaPictureBox.Image = null;

 

                    this.saveAreaMenuItem.Enabled = false;

 

                    this.saveWithoutAreaMenuItem.Enabled = false;

 

                    int gap = this.sourcePictureBox.Left;

 

                    this.areaPictureBox.Size    = this.sourcePictureBox.Size;

                    this.areaPictureBox.Left    = this.sourcePictureBox.Right + gap;

                    this.areaPictureBox.Visible = true;

 

                    this.withoutAreaPictureBox.Size    = this.sourcePictureBox.Size;

                    this.withoutAreaPictureBox.Left    = this.areaPictureBox.Right + gap;

                    this.withoutAreaPictureBox.Visible = true;

 

                    int width  = Math.Max(ClientSize.Width , this.withoutAreaPictureBox.Right + gap);

                    int height = Math.Max(ClientSize.Height, this.sourcePictureBox.Bottom + gap    );

 

                    ClientSize = new Size(width, height);

                }

                catch(Exception exception)

                {

                    MessageBox.Show(exception.Message);

                }

            }

        }

 

        #endregion

        #region 영역 저장하기 메뉴 항목 클릭시 처리하기 - saveAreaMenuItem_Click(sender, e)

 

        /// <summary>

        /// 영역 저장하기 메뉴 항목 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void saveAreaMenuItem_Click(object sender, EventArgs e)

        {

            if(this.saveFileDialog.ShowDialog() == DialogResult.OK)

            {

                SaveBitmap((Bitmap)this.areaPictureBox.Image, this.saveFileDialog.FileName);

            }

        }

 

        #endregion

        #region 영역을 제외하고 저장하기 메뉴 항목 클릭시 처리하기 - saveWithoutAreaMenuItem_Click(sender, e)

 

        /// <summary>

        /// 영역을 제외하고 저장하기 메뉴 항목 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void saveWithoutAreaMenuItem_Click(object sender, EventArgs e)

        {

            if(this.saveFileDialog.ShowDialog() == DialogResult.OK)

            {

                SaveBitmap((Bitmap)this.withoutAreaPictureBox.Image, 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 처리하기 - sourcePictureBox_MouseDown(sender, e)

 

        /// <summary>

        /// 소스 픽처 박스 마우스 DOWN 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void sourcePictureBox_MouseDown(object sender, MouseEventArgs e)

        {

            this.pointList = new List<Point>();

 

            this.isDrawing = true;

        }

 

        #endregion

        #region 소스 픽처 박스 마우스 이동시 처리하기 - sourcePictureBox_MouseMove(sender, e)

 

        /// <summary>

        /// 소스 픽처 박스 마우스 이동시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void sourcePictureBox_MouseMove(object sender, MouseEventArgs e)

        {

            if(!this.isDrawing)

            {

                return;

            }

 

            this.pointList.Add(new Point(e.X, e.Y));

 

            this.sourcePictureBox.Invalidate();

        }

 

        #endregion

        #region 소스 픽처 박스 마우스 UP 처리하기 - sourcePictureBox_MouseUp(sender, e)

 

        /// <summary>

        /// 소스 픽처 박스 마우스 UP 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void sourcePictureBox_MouseUp(object sender, MouseEventArgs e)

        {

            this.isDrawing = false;

 

            this.saveAreaMenuItem.Enabled = true;

 

            this.saveWithoutAreaMenuItem.Enabled = true;

 

            if(this.pointList == null)

            {

                return;

            }

 

            Bitmap areaBitmap = GetAreaBitmap((Bitmap)this.sourcePictureBox.Image, this.pointList);

 

            this.areaPictureBox.Image = GetSampleBitmap(areaBitmap);

 

            Bitmap withoutAreaBitmap = GetBitmapWithoutArea((Bitmap)this.sourcePictureBox.Image, this.pointList);

 

            this.withoutAreaPictureBox.Image = GetSampleBitmap(withoutAreaBitmap);

        }

 

        #endregion

        #region 소스 픽처 박스 페인트시 처리하기 - sourcePictureBox_Paint(sender, e)

 

        /// <summary>

        /// 소스 픽처 박스 페인트시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void sourcePictureBox_Paint(object sender, PaintEventArgs e)

        {

            if((this.pointList != null) && (this.pointList.Count > 1))

            {

                using(Pen pen = new Pen(Color.Black))

                {

                    pen.DashPattern = new float[] { 5, 5 };

 

                    e.Graphics.DrawLines(Pens.White, this.pointList.ToArray());

 

                    e.Graphics.DrawLines(pen, this.pointList.ToArray());

                }

            }

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////// Function

 

        #region 비트맵 구하기 - GetBitmap(filePath)

 

        /// <summary>

        /// 비트맵 구하기

        /// </summary>

        /// <param name="filePath">파일 경로</param>

        /// <returns>비트맵</returns>

        private Bitmap GetBitmap(string filePath)

        {

            using(Bitmap bitmep = (Bitmap)Image.FromFile(filePath))

            {

                return new Bitmap(bitmep);

            }

        }

 

        #endregion

        #region 영역 비트맵 구하기 - GetAreaBitmap(sourceBitmap, pointList)

 

        /// <summary>

        /// 영역 비트맵 구하기

        /// </summary>

        /// <param name="sourceBitmap">소스 비트맵</param>

        /// <param name="pointList">포인트 리스트</param>

        /// <returns>영역 비트맵</returns>

        private Bitmap GetAreaBitmap(Bitmap sourceBitmap, List<Point> pointList)

        {

            Bitmap targetBitmap = new Bitmap(sourceBitmap.Width, sourceBitmap.Height);

            

            using(Graphics graphics = Graphics.FromImage(targetBitmap))

            {

                graphics.Clear(Color.Transparent);

 

                using(Brush brush = new TextureBrush(sourceBitmap))

                {

                    graphics.FillPolygon(brush, pointList.ToArray());

                }

            }

 

            return targetBitmap;

        }

 

        #endregion

        #region 영역을 제외한 비트맵 구하기 - GetBitmapWithoutArea(sourceBitmap, pointList)

 

        /// <summary>

        /// 영역을 제외한 비트맵 구하기

        /// </summary>

        /// <param name="sourceBitmap">소스 비트맵</param>

        /// <param name="pointList">포인트 리스트</param>

        /// <returns>영역을 제외한 비트맵</returns>

        private Bitmap GetBitmapWithoutArea(Bitmap sourceBitmap, List<Point> pointList)

        {

            Bitmap targetBitmap = new Bitmap(sourceBitmap);

 

            using(Graphics graphics = Graphics.FromImage(targetBitmap))

            {

                GraphicsPath graphcisPath = new GraphicsPath();

 

                graphcisPath.AddPolygon(pointList.ToArray());

 

                graphics.SetClip(graphcisPath);

 

                graphics.Clear(Color.Transparent);

 

                graphics.ResetClip();

            }

 

            return targetBitmap;

        }

 

        #endregion

        #region 샘플 비트맵 구하기 - GetSampleBitmap(sourceBitmap)

 

        /// <summary>

        /// 샘플 비트맵 구하기

        /// </summary>

        /// <param name="sourceBitmap">소스 비트맵</param>

        /// <returns>샘플 비트맵</returns>

        private Bitmap GetSampleBitmap(Bitmap sourceBitmap)

        {

            const int BOX_WIDTH  = 20;

            const int BOX_HEIGHT = 20;

 

            Bitmap targetBitmap = new Bitmap(sourceBitmap.Width, sourceBitmap.Height);

 

            using(Graphics graphics = Graphics.FromImage(targetBitmap))

            {

                graphics.Clear(Color.White);

 

                int rowCount    = targetBitmap.Height / BOX_HEIGHT;

                int columnCount = targetBitmap.Width  / BOX_WIDTH;

 

                for(int row = 0; row < rowCount; row++)

                {

                    int y = row * BOX_HEIGHT;

 

                    for(int column = 0; column < columnCount; column++)

                    {

                        int x = 2 * column * BOX_WIDTH;

 

                        if(row % 2 == 1)

                        {

                            x += BOX_WIDTH;

                        }

 

                        graphics.FillRectangle(Brushes.LightBlue, x, y, BOX_WIDTH, BOX_HEIGHT);

                    }

                }

 

                graphics.DrawImageUnscaled(sourceBitmap, 0, 0);

            }

 

            return targetBitmap;

        }

 

        #endregion

        #region 비트맵 저장하기 - SaveBitmap(sourceBitmap, targetFilePath)

 

        /// <summary>

        /// 비트맵 저장하기

        /// </summary>

        /// <param name="sourceBitmap">소스 비트맵</param>

        /// <param name="targetFilePath">타겟 파일 경로</param>

        public void SaveBitmap(Bitmap sourceBitmap, string targetFilePath)

        {

            string fileExtension = Path.GetExtension(targetFilePath);

 

            switch(fileExtension.ToLower())

            {

                case ".bmp"  : sourceBitmap.Save(targetFilePath, ImageFormat.Bmp ); break;

                case ".exif" : sourceBitmap.Save(targetFilePath, ImageFormat.Exif); break;

                case ".gif"  : sourceBitmap.Save(targetFilePath, ImageFormat.Gif ); break;

                case ".jpg"  :

                case ".jpeg" : sourceBitmap.Save(targetFilePath, ImageFormat.Jpeg); break;

                case ".png"  : sourceBitmap.Save(targetFilePath, ImageFormat.Png ); break;

                case ".tif"  :

                case ".tiff" : sourceBitmap.Save(targetFilePath, ImageFormat.Tiff); break;

 

                default :

 

                    throw new NotSupportedException("알 수 없는 파일 확장자 입니다 : " + fileExtension);

            }

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요