WPF之WriteableBitmap操作

WPF之WriteableBitmap操作

在WPF(Windows Presentation Foundation)中,WriteBitmap 方法通常不是直接暴露给开发者的一个标准API方法,特别是在处理图像或位图时。然而,你提到的参数列表看起来像是用于创建或配置一个位图(Bitmap)对象时可能用到的参数,特别是在BitmapSource或类似类的上下文中。尽管不是直接针对WriteBitmap,但我们可以解释这些参数在类似上下文中的意义:

  1. int pixelWidth: 这个参数指定了位图的宽度,以像素为单位。它决定了位图水平方向上包含的像素点数量。

  2. int pixelHeight: 这个参数指定了位图的高度,以像素为单位。它决定了位图垂直方向上包含的像素点数量。

  3. double dpiX: 这个参数指定了位图水平方向上的每英寸点数(Dots Per Inch)。它帮助系统了解图像的物理尺寸与数字表示之间的关系,影响图像在显示时的缩放和打印效果。

使用目标DPI和内容的物理尺寸(以英寸为单位)来计算所需的像素尺寸。例如,如果你的按钮应该占据屏幕上的1英寸宽度,并且目标DPI是96DPI,那么按钮的宽度应该是 1英寸 * 96 DPI = 96像素。

  1. double dpiY: 类似于dpiX,但它是用于指定位图垂直方向上的每英寸点数。dpiXdpiY可以相同,表示图像在各个方向上具有相同的分辨率,也可以不同,以表示图像可能具有的特定方向性分辨率差异(尽管这在标准图像处理中不太常见)。

  2. PixelFormat pixelFormat: 这个参数指定了位图中每个像素的格式和颜色深度。PixelFormat枚举提供了多种预定义的格式,如Pbgra32(每个像素包含预乘alpha的蓝色、绿色、红色和alpha值,共32位)、Gray8(每个像素8位灰度值)等。选择正确的像素格式对于确保图像质量和处理效率至关重要。

  3. BitmapPalette palette: 这个参数在处理索引化像素格式时特别有用。索引化像素格式意味着每个像素的颜色不是直接存储在像素中,而是存储一个索引,该索引指向一个调色板(palette)中的颜色。BitmapPalette对象定义了这样一个调色板,允许在保持较低颜色深度和内存占用的同时,实现丰富的颜色表示。对于非索引化像素格式,这个参数可能不被使用或需要设置为null

在这里插入图片描述

<Window x:Class="WpfApp5.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:WpfApp5"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Image x:Name="ShowImage" Width="100" Height="100"></Image>
    </Grid>
</Window>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 static System.Net.Mime.MediaTypeNames;

namespace WpfApp5
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // 创建实例
            WriteableBitmap writeableBitmap = new WriteableBitmap(200, 200, 96, 96, PixelFormats.Bgra32, null);

            
            // 写RGBA像素值
            byte b = 0x00; // 0
            byte g = 0x00; // 0
            byte r = 0xFF; // 255
            byte a = 0xFF; // 不透明

            // 单像素值
            byte[] buf = { b, g, r, a };

            // 画条红横线
            for (int i = 0; i < 50; i++)
            {
                // 绘制一个点
                Int32Rect rect = new Int32Rect(i, 0, 1, 1);
                // 写进writeableBitmap,4表示bgra,0表示0 offset
                writeableBitmap.WritePixels(rect, buf, 4, 0);
            }

            // 进行图像显示
            ShowImage.Source = writeableBitmap;
        }
    }
}

示例2

通过指定脏区域(即发生变化的区域),AddDirtyRect 可以减少不必要的渲染工作。在复杂或大型的图像渲染场景中,如果整个图像都被标记为需要重新绘制,这将会消耗大量的计算资源。而使用 AddDirtyRect,只有指定区域的内容会被重新渲染,从而提高了渲染效率。

WMarkImage1.Lock();
unsafe
{
    byte[] tempR = new byte[width * height];


    Marshal.Copy(data, tempR, 0, width * height);


    for (int i = 0; i < width * height; i++)
    {
        temp1[i] = tempR[i];

    }

    Marshal.Copy(temp1, 0, WMarkImage1.BackBuffer, width * height);
}

// 指定区域的内容重新渲染
WMarkImage1.AddDirtyRect(new Int32Rect(0, 0, width, height));
WMarkImage1.Unlock();
WPF(Windows Presentation Foundation)是一个用于构建应用程序的框架,可用于创建图形化用户界面 (GUI)。WriteableBitmapWPF中的一个类,用于在内存中创建可编辑的位图。结合这两者,可以实现一个简单的视频播放器。 首先,需要导入WPF相关的命名空间,并创建一个MainWindow窗口。在窗口中,我们可以使用MediaElement控件来播放视频文件。MediaElement控件是WPF中的一个多媒体播放器。 然后,我们可以使用WriteableBitmap创建一个可编辑的位图实例,用于显示视频的帧。可以在XAML中创建一个Image控件,并将WriteableBitmap设置为其Source属性。 接下来,我们需要通过MediaElement控件的MediaOpened事件来获取视频的宽度和高度。一旦获取到这些值,我们可以创建一个与视频帧大小相同的WriteableBitmap,并使用响应的宽度和高度。 然后,可以通过MediaElement控件的MediaEnded事件来获取视频的帧并将其存储为WriteableBitmap。可以使用WriteableBitmap的Render方法,将视频的帧作为WriteableBitmap的可视化视图。 最后,可以通过在主窗口中的Image控件的Source属性中设置WriteableBitmap,来显示视频的帧。可以使用DispatcherTimer控件来定期更新帧,以实现动态的视频播放。 需要注意的是,这只是一个基本的框架,用于实现一个使用WriteableBitmap的简单视频播放器。实际开发中还需要考虑更多的细节,如视频编解码以及帧的处理和渲染等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值