首页 > 其他分享 >WPF WriteableBitmap通过GDI+绘制帮助类

WPF WriteableBitmap通过GDI+绘制帮助类

时间:2024-08-05 18:17:36浏览次数:20  
标签:System Drawing Source DataLength bitmap GDI WPF WriteableBitmap public

代码:


    public class WriteableBitmapGraphic : IDisposable
    {
        public WriteableBitmap Source { get; private set; }
        public System.Drawing.Bitmap bitmap { get; private set; }
        public int DataLength { get; private set; }
        public Int32Rect SourceRect { get; private set; }
        public System.Drawing.Rectangle BitmapRect { get; private set; }
        public System.Drawing.Graphics Graphics { get; private set; }
        System.Drawing.Imaging.PixelFormat pixelFormat;
        bool flushed = false;
        public WriteableBitmapGraphic(WriteableBitmap writeableBitmap)
        {
            Source = writeableBitmap;
            DataLength = Source.BackBufferStride * Source.PixelHeight;
            SourceRect = new Int32Rect(0, 0, Source.PixelWidth, Source.PixelHeight);
            BitmapRect = ConvertRect(SourceRect);
            pixelFormat = System.Drawing.Imaging.PixelFormat.Format32bppArgb;
            bitmap = new System.Drawing.Bitmap(writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, pixelFormat);
            Graphics = System.Drawing.Graphics.FromImage(bitmap);
        }
        public void FillSource()
        {
            var block = bitmap.LockBits(BitmapRect, System.Drawing.Imaging.ImageLockMode.WriteOnly, pixelFormat);
            byte[] tempArr = new byte[DataLength];
            Marshal.Copy(Source.BackBuffer, tempArr, 0, DataLength);
            Marshal.Copy(tempArr, 0, block.Scan0, DataLength);
            bitmap.UnlockBits(block);
        }

        public static System.Drawing.SolidBrush CreateBrush(System.Windows.Media.Color color)
        {
            return new System.Drawing.SolidBrush(ConvertColor(color));
        }
        public static System.Drawing.Color ConvertColor(System.Windows.Media.Color color)
        {
            return System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);
        }
        public static System.Drawing.Rectangle ConvertRect(System.Windows.Int32Rect rect)
        {
            return new System.Drawing.Rectangle(rect.X, rect.Y, rect.Width, rect.Height);
        }

        public void Flush()
        {
            Graphics.Flush();
            var block = bitmap.LockBits(ConvertRect(SourceRect), System.Drawing.Imaging.ImageLockMode.ReadOnly, pixelFormat);
            byte[] tempArr = new byte[DataLength];
            Marshal.Copy(block.Scan0, tempArr, 0, DataLength);
            Source.Lock();
            Source.AddDirtyRect(SourceRect);
            Marshal.Copy(tempArr, 0, Source.BackBuffer, DataLength);
            Source.Unlock();
            bitmap.UnlockBits(block);
            flushed = true;
        }

        public void Dispose()
        {
            if(!flushed)
                Flush();
            Graphics?.Dispose();
            bitmap?.Dispose();
        }
    }

 

标签:System,Drawing,Source,DataLength,bitmap,GDI,WPF,WriteableBitmap,public
From: https://www.cnblogs.com/RedSky/p/18343788

相关文章

  • WPF 布局控件的使用
    一、Grid1.Grid元素用于精确定位行和列中的内容。标签含义Grid.RowDefinitions可以创建任意行,进行固定高度与百分比高度设置。Grid.ColumnDefinitions可以创建任意列,进行固定宽度与百分宽度设置。 2.以下代码创建了两行,第一行占20像素高,第二行占剩......
  • 第十三章 -------------------WPF 和IronPython 联合编程
    1为什么我想用实现WPF和IronPython联合编程?我想解决的问题是利用已经写好的C#Class经过脚本的组合,使的原本单一的逻辑经过组合之后编程一个流程。我查阅了许多资料,也是参考了别人的代码。至于为什么要这么写我想来好多原因,其中最主要的原因可能就是为了适应程序的多变化S......
  • WPF【无限滚动图片浏览】自定义控件
    自定义控件自定义控件是我比较陌生的一个主题。我好久没练习过wpf了,需要巩固记忆。我想了一会儿,打开动漫之家,忽然觉得这个看漫画的图片浏览控件有意思。于是特地花了一天做了这个图片控件。我原本以为很容易,但实际上并不简单。这个图片浏览控件比我想象中要难许多,有技术上的难题......
  • WPF布局
    在WPF中,StackPanel是一个非常常用的布局控件,它会按照指定的方向(水平或垂直)依次排列子元素。然而,StackPanel本身并不提供直接的方法来让最后一个子元素占用剩余空间。然而,可以通过一些变通的方法来实现这一点。以下两种方法可以实现让StackPanel中的最后一个元素占用剩余空......
  • WPF C# implement scaletransform and translatetransfrom programmatically
    privatevoidInitRenderTransfrom(){TransformGrouptg=newTransformGroup();ScaleTransformst=newScaleTransform();if(!tg.Children.Contains(st)){tg.Children.Add(st);scaler=st;}TranslateTransformtt=n......
  • 【C#】WPF实现HaIcon图像缩放、移动
    1.HaIcon实现的C#代码////FilegeneratedbyHDevelopforHALCON/DOTNET(C#)Version12.0////ThisfileisintendedtobeusedwiththeHDevelopTemplateor//HDevelopTemplateWPFprojectslocatedunder%HALCONEXAMPLES%\c#usingSystem;usingSystem.Thre......
  • WPF 自定义对话框
    <Windowx:Class="WPFDemo2.窗体.CustomDialogWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas......
  • 【C#】WPF自定义Image实现图像缩放、平移
    1.xaml实现<UserControlx:Class="HalconDemo.ImageUserControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://sche......
  • 《深入浅出WPF》学习笔记三.x命名空间以及常见属性
    《深入浅出WPF》学习笔记三.x命名空间以及常见属性X命名空间的由来和作用xaml:是eXtensibleApplicationMarkupLanguage的英文缩写(可扩展应用程序标记语言);声明       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"使用x:Class="WpfApp10.Main......
  • wpf基础
    在WPF(WindowsPresentationFoundation)中,Style是一种强大的资源,允许你定义一组属性值,这些值可以被多个控件实例共享。使用Style可以减少重复的XAML代码,并且使得UI的一致性和可维护性得到提高。以下是一些Style的基本概念和用法:定义Style你可以在XAML中的......