-
[WPF]모눈종이 그리기C#/WPF_예제소스 2022. 6. 29. 13:51
==== 방법 2-2: WinForm을 이용하여 순수 Bitmap 그래픽으로 렌더링 ==== [DllImport("gdi32.dll")] private static extern bool DeleteObject(IntPtr hObject); private void DrawBitmap() { int size = 10; DateTime dt1 = DateTime.Now; System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(size * 250, size * 200); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap); int x1 = 0; int y1 = 0; System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Brushes.Black); for (int i = 0; i < 50000; i++) { x1 = (i % 250) * size; y1 = (i / 250) * size; g.DrawRectangle(pen, new System.Drawing.Rectangle(x1, y1, size, size)); } IntPtr hBitmap = bitmap.GetHbitmap(); try { BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); this.image2.Source = bitmapSource; } finally { DeleteObject(hBitmap); } DateTime dt2 = DateTime.Now; System.Diagnostics.Trace.WriteLine("DrawVisual == " + dt2.Subtract(dt1).TotalMilliseconds.ToString()); }
==== 방법 2-1: Bitmap 그래픽으로 렌더링 ==== <ScrollViewer HorizontalScrollBarVisibility="Auto" Grid.Column="1" x:Name="scrollViewer1" > <Image Name="image1" Stretch="None" /> </ScrollViewer> private void DrawVisual() { DrawingVisual dv = new DrawingVisual(); int size = 10; DateTime dt1 = DateTime.Now; DrawingContext dc = dv.RenderOpen(); Pen pen = new Pen(Brushes.Black, 1.0); Random rand = new Random(); double x1 = 0; double y1 = 0; for (int i = 0; i < 50000; i++) { x1 = (i % 250) * size; y1 = (i / 250) * size; dc.DrawRectangle(null, pen, new Rect(x1, y1, size, size)); } dc.Close(); RenderTargetBitmap rtb = new RenderTargetBitmap(size * 250, size * 200, 96, 96, PixelFormats.Pbgra32); rtb.Render(dv); image1.Source = rtb; DateTime dt2 = DateTime.Now; System.Diagnostics.Trace.WriteLine("DrawVisual == " + dt2.Subtract(dt1).TotalMilliseconds.ToString()); }
==== 방법 3: SnapsToDevicePixels 효과를 얻기 위해 GuidelineSet을 적용 ==== private void DrawVisual2(int size, int widthCount, int heightCount) { DrawingVisual dv = new DrawingVisual(); Matrix m = PresentationSource.FromVisual(this) .CompositionTarget.TransformToDevice; double dpiFactor = 1 / m.M11; DrawingContext dc = dv.RenderOpen(); Pen pen = new Pen(Brushes.Black, 1 * dpiFactor); pen.Freeze(); Rect rect = new Rect(0, 0, size * widthCount, size * heightCount); double halfPenWidth = pen.Thickness / 2; GuidelineSet guidelines = new GuidelineSet(); guidelines.GuidelinesX.Add(rect.Left + halfPenWidth); guidelines.GuidelinesX.Add(rect.Right + halfPenWidth); guidelines.GuidelinesY.Add(rect.Top + halfPenWidth); guidelines.GuidelinesY.Add(rect.Bottom + halfPenWidth); dc.PushGuidelineSet(guidelines); ...[생략]... dc.Pop(); dc.Close(); RenderTargetBitmap rtb = new RenderTargetBitmap(size * widthCount, size * heightCount, 96, 96, PixelFormats.Pbgra32); rtb.Render(dv); rtb.Freeze(); image3.Source = rtb; }
.NET Framework: 279. WPF - 그리기 성능 및 Blurring 문제
.NET Framework: 279. WPF - 그리기 성능 및 Blurring 문제 [링크 복사], [링크+제목 복사] 조회: 19700 글쓴 사람 정성태 (techsharer at outlook.com) 홈페이지 첨부 파일 부모글 보이기/감추기 WPF - 그리기 성능 및 Bl
www.sysnet.pe.kr
728x90'C# > WPF_예제소스' 카테고리의 다른 글
[WPF]MVVM Sample (0) 2022.07.11 [WPF] OnPropertyChanged (0) 2022.07.01 [C#]Canvas to BitmapImage (0) 2022.05.24 [C#] 열화상 이미지에 온도데이터 표출 (0) 2022.04.26 [C#] Redirect WriteLine stream to a textblock (0) 2022.04.12 댓글