HoloLens 2 UWP 位图图像伪影
HoloLens 2 UWP bitmap image artifacting
我正在为 HoloLens 2 上的 运行 构建一个 2D UWP 应用程序。在该应用程序中,我使用 RenderTargetBitmap 渲染视频源 UI 对象的位图,以从中获取静止图像作为软件位图对象。令人沮丧的是,当 运行 在 PC 上以 x86 模式运行它时,它工作正常。但是,当我在 Hololens 2 (ARM) 上 运行 时,图像会出现乱码,其中的伪像搞砸了图像。它似乎被分成不匹配的线。我添加了将图像文件保存到设备上的文件夹的功能,输出的图像看起来不错,但是当它在应用程序中设置为 imageSource 时 UI 它看起来一团糟。
在我的 VideoControl.xaml.cs 代码隐藏中:
private static async Task SetPauseImageSource()
{
await Instance.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
SoftwareBitmap image = await Xaml2Bitmap.CreateBitmapFromElement(Instance, true);
var source = new SoftwareBitmapSource();
await source.SetBitmapAsync(image);
Instance.imagePause.Source = source;
});
}
在我的 Xaml2Bitmap.cs class:
public static async Task<SoftwareBitmap> CreateBitmapFromElement(FrameworkElement uielement, bool saveFile = false, string filenamePrefix = "image")
{
SoftwareBitmap bitmap = null;
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(uielement);
var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
bitmap = SoftwareBitmap.CreateCopyFromBuffer(pixelBuffer, BitmapPixelFormat.Bgra8, (int)uielement.ActualWidth, (int)uielement.ActualHeight, BitmapAlphaMode.Ignore);
if (bitmap == null)
{
Debug.WriteLine("Bitmap is null");
}
if (saveFile)
{
var file = await SaveFile(filenamePrefix);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
logicalDpi,
logicalDpi,
pixelBuffer.ToArray());
await encoder.FlushAsync();
}
}
return bitmap;
}
private static async Task<StorageFile> SaveFile(string filenamePrefix)
{
var savePicker = new FileSavePicker();
savePicker.DefaultFileExtension = ".png";
savePicker.FileTypeChoices.Add(".png", new List<string> { ".png" });
savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
savePicker.SuggestedFileName = filenamePrefix + ".png";
// Prompt the user to select a file
var saveFile = await savePicker.PickSaveFileAsync();
return saveFile;
}
我们一如既往地感谢您提供任何帮助!
这最终修复了它。我需要将位图文件保存到设备并读回。不理想但它有效。
public static async Task<string> CreateBitmapFromElement(FrameworkElement uielement)
{
SoftwareBitmap bitmap = null;
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(uielement);
var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
bitmap = SoftwareBitmap.CreateCopyFromBuffer(pixelBuffer, BitmapPixelFormat.Bgra8, (int)uielement.ActualWidth, (int)uielement.ActualHeight, BitmapAlphaMode.Ignore);
if (bitmap == null)
{
Debug.WriteLine("Bitmap is null");
}
var folder = KnownFolders.PicturesLibrary;
var file = await folder.CreateFileAsync("pause.bmp", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
logicalDpi,
logicalDpi,
pixelBuffer.ToArray());
await encoder.FlushAsync();
await stream.WriteAsync(pixelBuffer);
}
return file.Name;
}
private static async Task SetImageSource()
{
await Instance.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
StorageFolder storageFolder = KnownFolders.PicturesLibrary;
string imagePath = await Xaml2Bitmap.CreateBitmapFromElement(Instance);
var file = await storageFolder.GetFileAsync(imagePath);
using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
BitmapImage bitmapImage = new BitmapImage();
await bitmapImage.SetSourceAsync(fileStream);
Instance.imagePause.Source = bitmapImage;
}
});
}
我正在为 HoloLens 2 上的 运行 构建一个 2D UWP 应用程序。在该应用程序中,我使用 RenderTargetBitmap 渲染视频源 UI 对象的位图,以从中获取静止图像作为软件位图对象。令人沮丧的是,当 运行 在 PC 上以 x86 模式运行它时,它工作正常。但是,当我在 Hololens 2 (ARM) 上 运行 时,图像会出现乱码,其中的伪像搞砸了图像。它似乎被分成不匹配的线。我添加了将图像文件保存到设备上的文件夹的功能,输出的图像看起来不错,但是当它在应用程序中设置为 imageSource 时 UI 它看起来一团糟。
在我的 VideoControl.xaml.cs 代码隐藏中:
private static async Task SetPauseImageSource()
{
await Instance.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
SoftwareBitmap image = await Xaml2Bitmap.CreateBitmapFromElement(Instance, true);
var source = new SoftwareBitmapSource();
await source.SetBitmapAsync(image);
Instance.imagePause.Source = source;
});
}
在我的 Xaml2Bitmap.cs class:
public static async Task<SoftwareBitmap> CreateBitmapFromElement(FrameworkElement uielement, bool saveFile = false, string filenamePrefix = "image")
{
SoftwareBitmap bitmap = null;
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(uielement);
var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
bitmap = SoftwareBitmap.CreateCopyFromBuffer(pixelBuffer, BitmapPixelFormat.Bgra8, (int)uielement.ActualWidth, (int)uielement.ActualHeight, BitmapAlphaMode.Ignore);
if (bitmap == null)
{
Debug.WriteLine("Bitmap is null");
}
if (saveFile)
{
var file = await SaveFile(filenamePrefix);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
logicalDpi,
logicalDpi,
pixelBuffer.ToArray());
await encoder.FlushAsync();
}
}
return bitmap;
}
private static async Task<StorageFile> SaveFile(string filenamePrefix)
{
var savePicker = new FileSavePicker();
savePicker.DefaultFileExtension = ".png";
savePicker.FileTypeChoices.Add(".png", new List<string> { ".png" });
savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
savePicker.SuggestedFileName = filenamePrefix + ".png";
// Prompt the user to select a file
var saveFile = await savePicker.PickSaveFileAsync();
return saveFile;
}
我们一如既往地感谢您提供任何帮助!
这最终修复了它。我需要将位图文件保存到设备并读回。不理想但它有效。
public static async Task<string> CreateBitmapFromElement(FrameworkElement uielement)
{
SoftwareBitmap bitmap = null;
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(uielement);
var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
bitmap = SoftwareBitmap.CreateCopyFromBuffer(pixelBuffer, BitmapPixelFormat.Bgra8, (int)uielement.ActualWidth, (int)uielement.ActualHeight, BitmapAlphaMode.Ignore);
if (bitmap == null)
{
Debug.WriteLine("Bitmap is null");
}
var folder = KnownFolders.PicturesLibrary;
var file = await folder.CreateFileAsync("pause.bmp", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
logicalDpi,
logicalDpi,
pixelBuffer.ToArray());
await encoder.FlushAsync();
await stream.WriteAsync(pixelBuffer);
}
return file.Name;
}
private static async Task SetImageSource()
{
await Instance.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
StorageFolder storageFolder = KnownFolders.PicturesLibrary;
string imagePath = await Xaml2Bitmap.CreateBitmapFromElement(Instance);
var file = await storageFolder.GetFileAsync(imagePath);
using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
BitmapImage bitmapImage = new BitmapImage();
await bitmapImage.SetSourceAsync(fileStream);
Instance.imagePause.Source = bitmapImage;
}
});
}