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

如何使用c#WinRT调整图像大小,c#,windows-runtime,windows-store-apps,visual-studio-2015,resize-image,C#,Windows Runtime,Windows Store Apps,Visual Studio 2015,Resize Image,几周前,我开始用Visual Studio 2015开发我的第一款windows应用程序metro。我注意到有些主题不容易找到清晰的信息 我正在尝试调整(缩小)以前保存在文件系统中的图像的大小,然后将其保存到另一个文件夹中 我找到了他们谈论这件事的地方。我已经修改了他们共享的代码,但结果图像对我来说是不可接受的。因为,我可以看到图像的结果似乎是“像素点”,特别是图像的细节。我不知道如何描述结果图像。。。就像使用旧的画笔应用程序一样,当我们更改图像大小时 我做错了什么?为什么会这样 我曾想过使用N

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

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

我找到了他们谈论这件事的地方。我已经修改了他们共享的代码,但结果图像对我来说是不可接受的。因为,我可以看到图像的结果似乎是“像素点”,特别是图像的细节。我不知道如何描述结果图像。。。就像使用旧的画笔应用程序一样,当我们更改图像大小时

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

我曾想过使用NuGet包作为替代方案,以更轻松地完成这项工作。在本例中,存在一些用于此任务的不错的NuGet包,并且能够在c#Visual Studio 2015中工作

我将分享我的代码功能:

transform.InterpolationMode = BitmapInterpolationMode.Fant;
注意:新尺寸与原始图像成比例,我正在处理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;
}
public async static Task ResizeImage(Windows.Storage.StorageFile sourceFile、Windows.Storage.StorageFile destinationFile、int newWidth、int newHeight、int dpi)
{
尝试
{
使用(var sourceStream=await sourceFile.OpenAsync(FileAccessMode.Read))
{
Windows.Graphics.Imaging.BitmapDecoder解码器=等待Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(sourceStream);
Windows.Graphics.Imaging.BitmapTransform transform=新建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。笔直,
使改变
ExifOrientationMode.REPECTEXIFORIENTION,
颜色管理模式(DoNotColorManage);
使用(var destinationStream=await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
{
BitmapEncoder编码器=等待BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId,destinationStream);
编码器.SetPixelData(BitmapPixelFormat.Rgba8,Bitmappalphamode.Premultiplied,Convert.ToUInt32(newWidth),Convert.ToUInt32(newHeight),Convert.ToUInt32(dpi),Convert.ToUInt32(dpi),pixelData.DetachPixelData());
等待编码器。FlushAsync();
}
}
}
捕获(例外情况除外)
{
ModuleLog.WriteError(例如ToString());
返回false;
}
返回true;
}

注意:我试图缩小图像的大小。例如,我有一个100 x 100像素的原始文件图像,我想获得一个50 x 50像素的文件图像。

我想我已经找到了解决方案

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

transform.InterpolationMode = BitmapInterpolationMode.Fant;
BitmapTransform具有InterpolationMode属性,您可以指定调整图像大小时要使用的插值类型

你可以看到所有的可能性


在我的例子中,我注意到使用“Fant”插值是获得最佳图像效果的最佳方法。

是否放大图像?如果是这样的话,它会看起来像垃圾……就像用放大镜看打印的图像。显然,我正在尝试缩小图像的大小。现在你已经编辑了你的文章,这是显而易见的。