我在XAML中定义了以下控件:
<Image x:Name="image" Stretch="None" Width="640" Height="480"/>
我还有一些数据存储在IntPtr中,表示BGRA 640x480图像. 对于本例,我们可以假设我从.png文件中读取图像(但这只是我可以从中获取图像数据的方法之一):
Bitmap bitmap = new Bitmap("image.png");
我认为为了更改Image控件的源,我可以使用WriteableBitmap.以下是我想出的一个完全正常工作的代码:
int width = 640;
int height = 480;
WriteableBitmap imageBitmap = new WriteableBitmap(width, height);
Bitmap bitmap = new Bitmap("image.png");
BitmapData bitmapData = bitmap.LockBits(
new Rectangle(0, 0, width, height),
ImageLockMode.ReadOnly, bitmap.PixelFormat
);
int size = width * height * 4;
byte[] managedArray = new byte[size];
Marshal.Copy(bitmapData.Scan0, managedArray, 0, size);
bitmap.UnlockBits(bitmapData);
imageBitmap.PixelBuffer.AsStream().Write(managedArray, 0, size);
this.image.Source = imageBitmap;
然而,上面的代码从IntPtr(bitmapData.Scan0)到byte[](管理数组)额外复制了一份,因为imageBitmap.PixelBuffer.AsStream().Write
不接受IntPtr作为参数.
有没有办法在没有多余副本的情况下做同样的事情?
附注:在WPF中,我曾经有过以下运行良好的代码,它不需要从IntPtr转换为byte[]:
imageBitmap = new WriteableBitmap(width, height, 96d, 96d, PixelFormats.Bgra32, null);
Int32Rect rect = new Int32Rect(0, 0, width, height);
imageBitmap.WritePixels(rect, bitmapData.Scan0, width * height * 4, stride);
this.image.Source = imageBitmap;
我想不出如何在WinUI3中做同样的事情