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

本文关键字:图像 调整 何用 WinRT | 更新日期: 2023-09-27 18:03:23

几个星期前,我开始用Visual Studio 2015开发我的第一个windows应用程序metro。我注意到有些话题不容易找到清晰的信息。

我正在尝试调整(缩小)之前保存在文件系统上的图像,然后将其保存到另一个文件夹。

我发现这个线程,他们正在谈论这个。我已经改编了他们共享的代码,但结果图像对我来说是不可接受的。因为,我可以看到图像的结果似乎是"像素点",特别是在图像的细节上。我不知道如何描述结果图像…像使用旧的油漆刷应用程序,当我们改变图像的大小。

我做错了什么?为什么会这样?

我考虑过使用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像素的文件图像。

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

我想我已经找到解决办法了。

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

transform.InterpolationMode = BitmapInterpolationMode.Fant;

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

在这里你可以看到所有的可能性。

在我的情况下,我注意到使用"Fant"插值是获得最佳图像结果的最佳方法。