WPF WriteableBitmap类 + gdi画线和文字

话不多说,直接上码:

1.新建wpfApp工程

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

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1" 
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="10*" ></RowDefinition>
        </Grid.RowDefinitions>

        <Button Name="button" Grid.Row="0" HorizontalAlignment="Center" Content="generate_bitmap" MinWidth="120"  MinHeight="30" Click="Button_Click"></Button>
        <Grid x:Name="imgGrid" Grid.Row="1">
            <Viewbox>
                <Image x:Name="img"  Width="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelWidth}"
                       Height="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelHeight}"
                        Source="{Binding CtrlImage, IsAsync=True}"
                      Stretch="None" />
            </Viewbox>
        </Grid>
    </Grid>
</Window>

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
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    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。

 

效果如下:

 

posted on 2022-01-25 13:57  wu.g.q  阅读(760)  评论(0编辑  收藏  举报

导航