WPF WriteableBitmap类 + gdi画线和文字


话不多说,直接上码:

1.新建wpfApp工程

2.MainWindow.xaml文件中代码如下:


    
        
            
            
        

        
        
            
                
            
        
    

3.mainwindow.xaml.cs代码如下:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace WpfApp1
{
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();           
        }

        public void Button_Click(object sender, RoutedEventArgs e)
        {
            
            WriteableBitmap wb = new WriteableBitmap((int)imgGrid.ActualWidth, (int)imgGrid.ActualHeight, 96, 96, PixelFormats.Pbgra32, null);

            wb.Lock();

            Bitmap backBitmap = new Bitmap((int)imgGrid.ActualWidth, (int)imgGrid.ActualHeight, wb.BackBufferStride, System.Drawing.Imaging.PixelFormat.Format32bppArgb, wb.BackBuffer);

            Graphics graphics = Graphics.FromImage(backBitmap);
            graphics.Clear(System.Drawing.Color.Black);

            GraphicsPath path = new GraphicsPath();
            path.FillMode = FillMode.Winding;

            DrawBackLines(path);

            AddPolyLines(path, 100, 100);
            AddPolyLines(path, 150, 150);
            AddPolyLines(path, 200, 200);

            graphics.DrawPath(new System.Drawing.Pen(System.Drawing.Color.Red, 1f), path);

            GraphicsPath fontPath = new GraphicsPath();            
            fontPath.AddString("Hello World", 
                new System.Drawing.FontFamily("Arial"), 
                (int)(System.Drawing.FontStyle.Regular), 
                22, 
                new PointF((float)(imgGrid.ActualWidth / 2), (float)(imgGrid.ActualHeight / 2)), 
                StringFormat.GenericDefault);
            graphics.DrawPath(new System.Drawing.Pen(System.Drawing.Color.Red, 2f), fontPath);
            graphics.Flush();

            wb.AddDirtyRect(new System.Windows.Int32Rect(0, 0, (int)imgGrid.ActualWidth, (int)imgGrid.ActualHeight));
            wb.Unlock();

            fontPath.Dispose();
            fontPath = null;

            path.Dispose();
            path = null;

            backBitmap.Dispose();
            backBitmap = null;

            img.Source = wb;
        }  


        public void DrawBackLines(GraphicsPath gPath)
        {
            int interval = 3;

            int lines = (int)imgGrid.ActualWidth / interval;

            if ((int)imgGrid.ActualWidth % interval != 0)
            {
                lines += 1;
            }


            for (int i = 0; i <= lines; i++)
            {
                System.Drawing.Point tmp;
                tmp = new System.Drawing.Point(i * interval, 0);
                if (tmp.X > imgGrid.ActualWidth)
                    tmp.X = (int)imgGrid.ActualWidth;
                System.Drawing.Point StartPoint = tmp;

                tmp = new System.Drawing.Point(i * interval, (int)imgGrid.ActualHeight);
                if (tmp.X > imgGrid.ActualWidth)
                    tmp.X = (int)imgGrid.ActualWidth;
                System.Drawing.Point EndPoint = tmp;

                gPath.AddLine(StartPoint, EndPoint);
                gPath.CloseFigure();
            }
        }


        public void AddPolyLines(GraphicsPath gPath, int X, int Y)
        {
            for (int i = 0; i < 300000; i++)
            {
                int x = X + i * 2;
                int y = Y + i * 2;

                gPath.AddPolygon(new PointF[] { new PointF(x + 20, y), new PointF(x, y + 20), new PointF(x + 20, y + 20) });
                gPath.CloseFigure();
            }
        }
     }
}

  如果编译报错的话,需要在工程添加引用 System.Drawing。

效果如下:

C