如何将 IImageProvider 编码为 PNG 图像?
How to encode IImageProvider as a PNG image?
假设我有一个 LumiaImagingSDK 渲染链设置,以及我想要渲染的最终 IImageProvider 对象,我该如何将其编码为 PNG 图像?
Lumia Imaging SDK 支持 PNG 图像作为输入,但 SDK 中没有 "PNG Renderer" 可用。
幸运的是,如果您正在为 Windows 8.1(StoreApplication / 通用应用程序/Windows phone 8.1 项目)开发,那么有一个 Windows 编码器(Windows.Graphics.Imaging.BitmapEncoder) 你可以使用。
假设您要渲染的 IImageProvider 被称为 "source" 这是一个代码片段,您可以使用它来将生成的图像编码为 PNG:
using Lumia.Imaging;
using Windows.Graphics.Imaging;
using System.IO;
...
using (var renderer = new BitmapRenderer(source, ColorMode.Bgra8888))
{
var bitmap = await renderer.RenderAsync();
byte[] pixelBuffer = bitmap.Buffers[0].Buffer.ToArray();
using (var stream = new InMemoryRandomAccessStream())
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream).AsTask().ConfigureAwait(false);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)bitmap.Dimensions.Width, (uint)bitmap.Dimensions.Height, 96, 96, pixelBuffer);
await encoder.FlushAsync().AsTask().ConfigureAwait(false);
//If InMemoryRandomAccessStream (IRandomAccessStream) works for you, end here.
//If you need an IBuffer, here is how you get one:
using (var memoryStream = new MemoryStream())
{
memoryStream.Capacity = (int)stream.Size;
var ibuffer = memoryStream.GetWindowsRuntimeBuffer();
await stream.ReadAsync(ibuffer, (uint)stream.Size, InputStreamOptions.None).AsTask().ConfigureAwait(false);
}
}
}
这将根据您的需要为您提供 InMemoryRandomAccessStream
(IRandomAccessStream
) 或 IBuffer
内存字节。然后您可以将缓冲区保存到磁盘或将其传递给应用程序的其他部分。
假设我有一个 LumiaImagingSDK 渲染链设置,以及我想要渲染的最终 IImageProvider 对象,我该如何将其编码为 PNG 图像?
Lumia Imaging SDK 支持 PNG 图像作为输入,但 SDK 中没有 "PNG Renderer" 可用。
幸运的是,如果您正在为 Windows 8.1(StoreApplication / 通用应用程序/Windows phone 8.1 项目)开发,那么有一个 Windows 编码器(Windows.Graphics.Imaging.BitmapEncoder) 你可以使用。
假设您要渲染的 IImageProvider 被称为 "source" 这是一个代码片段,您可以使用它来将生成的图像编码为 PNG:
using Lumia.Imaging;
using Windows.Graphics.Imaging;
using System.IO;
...
using (var renderer = new BitmapRenderer(source, ColorMode.Bgra8888))
{
var bitmap = await renderer.RenderAsync();
byte[] pixelBuffer = bitmap.Buffers[0].Buffer.ToArray();
using (var stream = new InMemoryRandomAccessStream())
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream).AsTask().ConfigureAwait(false);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)bitmap.Dimensions.Width, (uint)bitmap.Dimensions.Height, 96, 96, pixelBuffer);
await encoder.FlushAsync().AsTask().ConfigureAwait(false);
//If InMemoryRandomAccessStream (IRandomAccessStream) works for you, end here.
//If you need an IBuffer, here is how you get one:
using (var memoryStream = new MemoryStream())
{
memoryStream.Capacity = (int)stream.Size;
var ibuffer = memoryStream.GetWindowsRuntimeBuffer();
await stream.ReadAsync(ibuffer, (uint)stream.Size, InputStreamOptions.None).AsTask().ConfigureAwait(false);
}
}
}
这将根据您的需要为您提供 InMemoryRandomAccessStream
(IRandomAccessStream
) 或 IBuffer
内存字节。然后您可以将缓冲区保存到磁盘或将其传递给应用程序的其他部分。