ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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;
    }

     

    WpfApplication1.zip
    0.08MB

     

     

     

    .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

    댓글

Designed by Tistory.