如何在 UWP C# 中共享过滤后的图像

How to share filtered image in UWP C#

我有一个图像处理 windows 10 应用程序。我正在对该图像应用过滤器并将其显示在图像元素上。这就是我应用滤镜并将其设置为 MainImage 元素源的方式。

 ProcessImage processImage = new ProcessImage(sourcePixels, width, height);

       byte[] blurEffect = processImage.BlurEffect(width, height);

        WriteableBitmap blurImage = new WriteableBitmap((int)width, (int)height);
        using (Stream stream = blurImage.PixelBuffer.AsStream())
        {
            await stream.WriteAsync(blurEffect, 0, blurEffect.Length);
            MainImage.Source = blurImage;
        }

到目前为止,我已经将 WriteableBitmap 图像设置为源。现在,我想使用 DataTransferManager 的数据请求事件共享此图像,如图所示

 dataTransferManager = DataTransferManager.GetForCurrentView();
        dataTransferManager.DataRequested += DataTransferManager_DataRequested;

包含此代码的事件正文

 DataPackage dataPackage = args.Request.Data;
        dataPackage.Properties.Title = "App Name";
        dataPackage.Properties.Description = "My description";

        dataPackage.SetBitmap();

在分享按钮点击事件中,我是这样调用showshareUI的

DataTransferManager.ShowShareUI();

我正在尝试使用上面第四行的 SetBitmap 方法来共享图像,但这里的问题是此方法需要 RandomAccessStreamReference 值,并且我有一个 writeablebitmap 类型的过滤图像。我怎样才能完成这件事?

您可以将 WriteableBitmap 写入 InMemoryRandomAccessStream

我无法访问我的开发机器,因此无法对其进行测试,但这里有一个快速示例:

private async Task<IRandomAccessStream> Convert(WriteableBitmap writeableBitmap)
    {
        var stream = new InMemoryRandomAccessStream();

        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
        Stream pixelStream = writeableBitmap.PixelBuffer.AsStream();
        byte[] pixels = new byte[pixelStream.Length];
        await pixelStream.ReadAsync(pixels, 0, pixels.Length);

        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)writeableBitmap.PixelWidth, (uint)writeableBitmap.PixelHeight, 96.0, 96.0, pixels);
        await encoder.FlushAsync();

        return stream;
    }

由于 dataPackage.SetBitmap() 需要一个 RandomAccessStreamReference 对象,您需要根据上述方法 returns 获得一个基于 IRandomAccessStream 的对象。幸运的是,这很容易:

var streamRef = RandomAccessStreamReference.CreateFromStream(stream)

希望有用。