如何在 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)
希望有用。
我有一个图像处理 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)
希望有用。