WPF之WriteableBitmap操作
在WPF(Windows Presentation Foundation)中,WriteBitmap
方法通常不是直接暴露给开发者的一个标准API方法,特别是在处理图像或位图时。然而,你提到的参数列表看起来像是用于创建或配置一个位图(Bitmap)对象时可能用到的参数,特别是在BitmapSource
或类似类的上下文中。尽管不是直接针对WriteBitmap
,但我们可以解释这些参数在类似上下文中的意义:
-
int pixelWidth: 这个参数指定了位图的宽度,以像素为单位。它决定了位图水平方向上包含的像素点数量。
-
int pixelHeight: 这个参数指定了位图的高度,以像素为单位。它决定了位图垂直方向上包含的像素点数量。
-
double dpiX: 这个参数指定了位图水平方向上的每英寸点数(Dots Per Inch)。它帮助系统了解图像的物理尺寸与数字表示之间的关系,影响图像在显示时的缩放和打印效果。
使用目标DPI和内容的物理尺寸(以英寸为单位)来计算所需的像素尺寸。例如,如果你的按钮应该占据屏幕上的1英寸宽度,并且目标DPI是96DPI,那么按钮的宽度应该是 1英寸 * 96 DPI = 96像素。
-
double dpiY: 类似于
dpiX
,但它是用于指定位图垂直方向上的每英寸点数。dpiX
和dpiY
可以相同,表示图像在各个方向上具有相同的分辨率,也可以不同,以表示图像可能具有的特定方向性分辨率差异(尽管这在标准图像处理中不太常见)。 -
PixelFormat pixelFormat: 这个参数指定了位图中每个像素的格式和颜色深度。
PixelFormat
枚举提供了多种预定义的格式,如Pbgra32
(每个像素包含预乘alpha的蓝色、绿色、红色和alpha值,共32位)、Gray8
(每个像素8位灰度值)等。选择正确的像素格式对于确保图像质量和处理效率至关重要。 -
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();