簡體   English   中英

如何使用C#WinRT調整圖像大小

[英]How to resize an image with c# WinRT

不到幾周前,我開始使用Visual Studio 2015開發我的第一個Windows應用程序Metro。我注意到有些主題不容易找到清晰的信息。

我正在嘗試調整(縮小)以前保存在文件系統上的圖像的大小,然后將其保存到另一個文件夾。

我在他們談論這個話題的地方找到了這個話題 我已經調整了他們共享的代碼,但是結果圖像對我來說是不可接受的。 因為,我可以看到圖像的結果似乎是“像素點”,特別是在圖像細節上。 我不知道如何描述結果圖像...當我們更改大小圖像時,就像使用舊的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像素的文件圖像。

我認為我已經找到了解決方案。

我在函數中添加了以下行:

transform.InterpolationMode = BitmapInterpolationMode.Fant;

BitmapTransform具有InterpolationMode屬性,您可以指定在調整圖像大小時要使用的插值類型。

在這里您可以看到所有可能性。

就我而言,我注意到使用“ Fant”插值法是獲得最佳圖像效果的最佳方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM