HoloLens 2 UWP位图图像伪像

问题描述

我正在构建一个可在HoloLens 2上运行的2D UWP应用。在该应用中,我正在使用rendertargetBitmap渲染视频源UI对象的位图,以从中获取静止图像作为SoftwareBitmap对象。令人沮丧的是,在PC上以x86模式运行它时,它可以正常工作。但是,当我在Hololens 2(ARM)上运行时,图像中会出现乱码,从而使图像变乱。它似乎被分成不匹配的行。我添加了将图像文件保存到设备上的文件夹中的功能输出的图像看起来不错,但是当在应用程序用户界面中将其设置为imageSource时,它看起来就搞砸了。

在我的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类中:

    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,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;
    }     

The image appearance on HoloLens 2

在这方面的任何帮助都将一如既往!

解决方法

这最终解决了它。我需要将位图文件保存到设备中,然后再读回。不理想,但是可以。

    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,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;
            }
        });         
    }