■ Parallel 클래스의 For 정적 메소드를 사용해 비트맵을 처리하는 방법을 보여준다.
▶ MainForm.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
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 } } |
※ 비트맵 처리 연산량이 많을수록 병렬 처리 효과가 높다.