■ Parallel 클래스 : For 정적 메소드를 사용해 비트맵 처리하기

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


TestProject.zip


MainForm.cs

 

 

using System;

using System.Drawing;

using System.Drawing.Imaging;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace TestProject

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : Form

    {

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

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

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            Bitmap sourceBitmap = Bitmap.FromFile("image.jpg") as Bitmap;

 

            Bitmap targetBitmap = sourceBitmap.Clone() as Bitmap;

            

            ProcessBitmap(targetBitmap);

 

            this.sourcePictureBox.Image = sourceBitmap;

            this.targetPictureBox.Image = targetBitmap;

        }

 

        #endregion

 

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

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

 

        #region 비트맵 처리하기 - ProcessBitmap(targetBitmap)

 

        /// <summary>

        /// 비트맵 처리하기

        /// </summary>

        /// <param name="targetBitmap">타겟 비트맵</param>

        private void ProcessBitmap(Bitmap targetBitmap)

        {

            int targetBitmapWidth  = targetBitmap.Width;

            int targetBitmapHeight = targetBitmap.Height;

 

            BitmapData targetBitmapData = targetBitmap.LockBits

            (

                new Rectangle(0, 0, targetBitmapWidth, targetBitmapHeight),

                ImageLockMode.ReadWrite,

                PixelFormat.Format24bppRgb

            );

 

            int targetBitmapStride = targetBitmapData.Stride;

 

            IntPtr scan0Handle = targetBitmapData.Scan0;

 

            unsafe

            {

                byte* pointer = (byte*)(void*)scan0Handle;

 

                Parallel.For

                (

                    0,

                    targetBitmapHeight,

                    y => {

 

                        Parallel.For

                        (

                            0,

                            targetBitmapWidth,

                            x => {

 

                                int position = y * targetBitmapStride + x * 3;

 

                                pointer[position + 2] = 0;

                            }

                        );

                    }

                );

            }

 

            targetBitmap.UnlockBits(targetBitmapData);

        }

 

        #endregion

    }

}

 

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

※ 비트맵 처리 연산량이 많을수록 병렬 처리 효과가 높다.

Posted by 사용자 icodebroker

댓글을 달아 주세요