几周以前,我已经开始使用Visual Studio 2015开发我的第一个Windows应用程序地铁了。我注意到有些主题不容易找到明确的信息。
我尝试调整(缩小)之前保存在文件系统上的图像,然后将其保存到另一个文件夹。
我发现this thread他们正在谈论这个问题。我已经调整了他们共享的代码,但结果图片对我来说是不可接受的。因为,我可以看到图像的结果似乎是像素点",特别是图像的细节。我不知道如何描述结果图像...就像使用旧的Paint Brush应用程序一样,当我们更改尺寸图像时。
我做错了什么?为什么会这样?
我认为使用NuGet包作为替代方案,可以更轻松地完成这项工作。在这种情况下,为此任务存在一些不错的NuGet包,并且能够在c#Visual Studio 2015中工作吗?
我要分享我的代码功能:
注意:新尺寸与原始图像成正比,我正在使用PNG图像。
public async static Task<bool> ResizeImage(Windows.Storage.StorageFile sourceFile, Windows.Storage.StorageFile destinationFile, int newWidth, int newHeight, int dpi)
{
try
{
using (var sourceStream = await sourceFile.OpenAsync(FileAccessMode.Read))
{
Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(sourceStream);
Windows.Graphics.Imaging.BitmapTransform transform = new Windows.Graphics.Imaging.BitmapTransform() { ScaledHeight = Convert.ToUInt32(newHeight), ScaledWidth = Convert.ToUInt32(newWidth) };
Windows.Graphics.Imaging.PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
Windows.Graphics.Imaging.BitmapPixelFormat.Rgba8,
BitmapAlphaMode.Straight,
transform,
ExifOrientationMode.RespectExifOrientation,
ColorManagementMode.DoNotColorManage);
using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, destinationStream);
encoder.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Premultiplied, Convert.ToUInt32(newWidth), Convert.ToUInt32(newHeight), Convert.ToUInt32(dpi), Convert.ToUInt32(dpi), pixelData.DetachPixelData());
await encoder.FlushAsync();
}
}
}
catch (Exception ex)
{
ModuleLog.WriteError(ex.ToString());
return false;
}
return true;
}
注意:我试图减小图像的大小。例如,我有100 x 100像素的原始文件图像,我想获得50 x 50像素的文件图像。
答案 0 :(得分:2)
我认为我找到了解决方案。
我在我的函数中添加了这一行:
transform.InterpolationMode = BitmapInterpolationMode.Fant;
BitmapTransform具有InterpolationMode属性,您可以指定我们在调整图像大小时要使用的插值类型。
Here你可以看到所有可能性。
就我而言,我注意到使用“Fant”插值是获得最佳图像效果的最佳选择。