升级blit的质量(Winrt c#)
实际上,我试着制作一幅独特的画布图像,上面有很多东西 我创建了一个图像与我需要的一切,但图像的质量真的很差。你知道我如何升级它吗 这是我保存图像时代码的结尾:升级blit的质量(Winrt c#),c#,windows-runtime,blit,writeablebitmapex,C#,Windows Runtime,Blit,Writeablebitmapex,实际上,我试着制作一幅独特的画布图像,上面有很多东西 我创建了一个图像与我需要的一切,但图像的质量真的很差。你知道我如何升级它吗 这是我保存图像时代码的结尾: StorageFile filesave = await ApplicationData.Current.LocalFolder.CreateFileAsync("filesave.jpg", CreationCollisionOption.ReplaceExisting); Guid encoderId = Windo
StorageFile filesave = await ApplicationData.Current.LocalFolder.CreateFileAsync("filesave.jpg", CreationCollisionOption.ReplaceExisting);
Guid encoderId = Windows.Graphics.Imaging.BitmapEncoder.JpegEncoderId;
await WinRTXamlToolkit.Imaging.WriteableBitmapSaveExtensions.SaveToFile(backgroundBmp, filesave, encoderId);
如果有人有主意的话?谢谢您的时间,问候。这是SaveToFile方法的来源:
/// <summary>
/// Saves the WriteableBitmap to the given file with the specified BitmapEncoder ID.
/// </summary>
/// <param name="writeableBitmap">The writeable bitmap.</param>
/// <param name="outputFile">The output file.</param>
/// <param name="encoderId">The encoder id.</param>
/// <returns></returns>
public static async Task SaveToFile(
this WriteableBitmap writeableBitmap,
StorageFile outputFile,
Guid encoderId)
{
Stream stream = writeableBitmap.PixelBuffer.AsStream();
byte[] pixels = new byte[(uint)stream.Length];
await stream.ReadAsync(pixels, 0, pixels.Length);
using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await BitmapEncoder.CreateAsync(encoderId, writeStream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied,
(uint)writeableBitmap.PixelWidth,
(uint)writeableBitmap.PixelHeight,
96,
96,
pixels);
await encoder.FlushAsync();
using (var outputStream = writeStream.GetOutputStreamAt(0))
{
await outputStream.FlushAsync();
}
}
}
然后,您可以将SaveToJpg写为:
/// <summary>
/// Saves the WriteableBitmap to the given JPG file with the specified image quality.
/// </summary>
/// <param name="writeableBitmap">The writeable bitmap.</param>
/// <param name="outputFile">The output file.</param>
/// <param name="imageQuality">Valid values from 0 to 1.0. Higher values indicate higher quality.</param>
/// <returns></returns>
public static async Task SaveToJpg(
WriteableBitmap writeableBitmap,
StorageFile outputFile,
double imageQuality = 1.0 // Maximum quality
)
{
Stream stream = writeableBitmap.PixelBuffer.AsStream();
byte[] pixels = new byte[(uint)stream.Length];
await stream.ReadAsync(pixels, 0, pixels.Length);
using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
{
var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
var qualityValue = new Windows.Graphics.Imaging.BitmapTypedValue(
imageQuality,
Windows.Foundation.PropertyType.Single
);
propertySet.Add("ImageQuality", qualityValue);
var encoder = await BitmapEncoder.CreateAsync(
BitmapEncoder.JpegEncoderId,
writeStream
propertySet);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied,
(uint)writeableBitmap.PixelWidth,
(uint)writeableBitmap.PixelHeight,
96,
96,
pixels);
await encoder.FlushAsync();
using (var outputStream = writeStream.GetOutputStreamAt(0))
{
await outputStream.FlushAsync();
}
}
}
//
///将WriteableBitmap保存到具有指定图像质量的给定JPG文件。
///
///可写位图。
///输出文件。
///从0到1.0的有效值。值越高表示质量越高。
///
公共静态异步任务SaveToJpg(
WriteableBitmap WriteableBitmap,
StorageFile输出文件,
双图像质量=1.0//最大质量
)
{
Stream=writeableBitmap.PixelBuffer.AsStream();
字节[]像素=新字节[(uint)stream.Length];
wait stream.ReadAsync(像素,0,像素,长度);
使用(var writeStream=await outputFile.OpenAsync(FileAccessMode.ReadWrite))
{
var propertySet=新的Windows.Graphics.Imaging.BitmapPropertySet();
var qualityValue=new Windows.Graphics.Imaging.BitmapTypedValue(
图像质量,
窗体
);
添加(“图像质量”,qualityValue);
var编码器=等待BitmapEncoder.CreateAsync(
BitmapEncoder.JpegEncoderId,
writeStream
房地产;
编码器.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.预乘,
(uint)writeableBitmap.PixelWidth,
(uint)writeableBitmap.PixelHeight,
96,
96,
像素);
等待编码器。FlushAsync();
使用(var outputStream=writeStream.getOutputstreeamat(0))
{
等待outputStream.FlushAsync();
}
}
}
您可以编辑扩展方法以获得更好的图像质量。您所说的“编辑扩展方法”是什么意思?请下载WinRT Xaml Toolkit的源代码并编辑SaveToFile
扩展方法。这是错误的项目。您发布的代码来自WiRTXAMLoToCKIT,因此请考虑更改标签和标题。我在这里已经回答了:
/// <summary>
/// Saves the WriteableBitmap to the given JPG file with the specified image quality.
/// </summary>
/// <param name="writeableBitmap">The writeable bitmap.</param>
/// <param name="outputFile">The output file.</param>
/// <param name="imageQuality">Valid values from 0 to 1.0. Higher values indicate higher quality.</param>
/// <returns></returns>
public static async Task SaveToJpg(
WriteableBitmap writeableBitmap,
StorageFile outputFile,
double imageQuality = 1.0 // Maximum quality
)
{
Stream stream = writeableBitmap.PixelBuffer.AsStream();
byte[] pixels = new byte[(uint)stream.Length];
await stream.ReadAsync(pixels, 0, pixels.Length);
using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
{
var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
var qualityValue = new Windows.Graphics.Imaging.BitmapTypedValue(
imageQuality,
Windows.Foundation.PropertyType.Single
);
propertySet.Add("ImageQuality", qualityValue);
var encoder = await BitmapEncoder.CreateAsync(
BitmapEncoder.JpegEncoderId,
writeStream
propertySet);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied,
(uint)writeableBitmap.PixelWidth,
(uint)writeableBitmap.PixelHeight,
96,
96,
pixels);
await encoder.FlushAsync();
using (var outputStream = writeStream.GetOutputStreamAt(0))
{
await outputStream.FlushAsync();
}
}
}