GenerateBitmap.axaml代码
<Window xmlns="https://github.com/avaloniaui"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"Width="460" Height="472"x:Class="AvaloniaUI.GenerateBitmap"Title="GenerateBitmap"><Grid RowDefinitions="auto,*"><Button Content="Button" Grid.Row="1" Height="81" HorizontalAlignment="Left" Margin="106,90,0,0" Name="button1" VerticalAlignment="Top" Width="193" /><Button Content="Generate Bitmap" Margin="5" Padding="10" Click="cmdGenerate_Click" HorizontalAlignment="Center"></Button><Image Grid.Row="1" Name="img" Margin="5" Width="400" Height="300" IsHitTestVisible="False"></Image></Grid> </Window>
GenerateBitmap.axaml.cs代码
using Avalonia; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; using Avalonia.Media.Imaging; using Avalonia.Platform; using System; using System.Runtime.InteropServices;namespace AvaloniaUI;public partial class GenerateBitmap : Window {public GenerateBitmap(){InitializeComponent();}private void cmdGenerate_Click(object? sender, RoutedEventArgs e){// 确保图像尺寸有效if (img.Width <= 0 || img.Height <= 0) return;// 创建 WriteableBitmapvar size = new PixelSize((int)img.Width, (int)img.Height);var dpi = new Vector(96, 96);var wb = new WriteableBitmap(size, dpi, PixelFormat.Bgra8888, AlphaFormat.Premul);// 使用 Lock() 获取帧缓冲区using (var buffer = wb.Lock()){int bytesPerPixel = PixelFormat.Bgra8888.BitsPerPixel / 8; // BGRA8888 格式每个像素4字节(32位)int stride = buffer.RowBytes;Random rand = new Random();// 创建像素数组byte[] pixels = new byte[stride * size.Height];for (int y = 0; y < size.Height; y++){for (int x = 0; x < size.Width; x++){int alpha, red, green, blue;if ((x % 5 == 0) || (y % 7 == 0)){red = (int)((double)y / size.Height * 255);green = rand.Next(100, 255);blue = (int)((double)x / size.Width * 255);alpha = 255;}else{red = (int)((double)x / size.Width * 255);green = rand.Next(100, 255);blue = (int)((double)y / size.Height * 255);alpha = 50;}int pixelOffset = y * stride + x * bytesPerPixel;pixels[pixelOffset] = (byte)blue; // Bpixels[pixelOffset + 1] = (byte)green; // Gpixels[pixelOffset + 2] = (byte)red; // Rpixels[pixelOffset + 3] = (byte)alpha; // A}}// 使用 Marshal.Copy 将数据复制到缓冲区Marshal.Copy(pixels, 0, buffer.Address, pixels.Length);}img.Source = wb;} }
运行效果