如何使用c#WinRT调整图像大小

时间:2015-07-19 16:24:34

标签: c# windows-runtime windows-store-apps visual-studio-2015 resize-image

几周以前,我已经开始使用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像素的文件图像。

1 个答案:

答案 0 :(得分:2)

我认为我找到了解决方案。

我在我的函数中添加了这一行:

transform.InterpolationMode = BitmapInterpolationMode.Fant;

BitmapTransform具有InterpolationMode属性,您可以指定我们在调整图像大小时要使用的插值类型。

Here你可以看到所有可能性。

就我而言,我注意到使用“Fant”插值是获得最佳图像效果的最佳选择。