如何在 Windows 10 UWP 中复制和调整图像大小

Posted

技术标签:

【中文标题】如何在 Windows 10 UWP 中复制和调整图像大小【英文标题】:How to Copy and Resize Image in Windows 10 UWP 【发布时间】:2016-07-01 09:12:22 【问题描述】:

我使用http://www.codeproject.com/Tips/552141/Csharp-Image-resize-convert-and-save 中的代码以编程方式调整图像大小。但是,该项目使用 System.Drawing 库,这些库不适用于 Windows 10 应用程序。

我尝试使用 Windows.UI.Xaml.Media.Imaging 中的 BitmapImage 类,但它似乎没有提供 System.Drawing 中的功能。

有没有人能够在 Windows 10 中调整(缩小)图像的大小?我的应用程序将处理来自多个来源、不同格式/大小的图像,并且我正在尝试调整实际图像的大小以节省空间,而不是让应用程序调整其大小以适应正在显示的Image

编辑

我已经修改了上述链接中的代码,并且有一个可以满足我特定需求的 hack。这里是:

public static BitmapImage ResizedImage(BitmapImage sourceImage, int maxWidth, int maxHeight)

    var origHeight = sourceImage.PixelHeight;
    var origWidth = sourceImage.PixelWidth;
    var ratioX = maxWidth/(float) origWidth;
    var ratioY = maxHeight/(float) origHeight;
    var ratio = Math.Min(ratioX, ratioY);
    var newHeight = (int) (origHeight * ratio);
    var newWidth = (int) (origWidth * ratio);

    sourceImage.DecodePixelWidth = newWidth;
    sourceImage.DecodePixelHeight = newHeight;

    return sourceImage;

这种方式似乎可行,但理想情况下,我不想修改原始BitmapImage,而是创建一个新的/副本来修改并返回。

这里是它的一个镜头:

【问题讨论】:

误导性标题,OP。您有一种调整图像大小的方法,您真正想做的是创建原始图像的副本,调整副本大小,然后返回副本。 @BrianDriscoll 我在编辑之前发布了这个问题。编辑添加了用于调整原始图像大小的代码。我会发布它作为答案,但它还不够长。但我确实喜欢这个新标题。谢谢。 你能创建一个图像的常量吗?还是私有属性,您可以只引用图像的原始副本并使用相同的功能? 由于我不需要保持原始图像数据完整,现在这样就可以了。我只是考虑将来的概括,我可能想返回原始BitmapImage 的副本而不是修改原始版本。 【参考方案1】:

我可能想要返回原始BitmapImage 的副本,而不是修改原始版本。

没有直接复制BitmapImage的好方法,但我们可以多次重复使用StorageFile

如果你只想选择一张图片,显示它,同时显示原始图片的调整大小的图片,你可以像这样传递StorageFile作为参数:

public static async Task<BitmapImage> ResizedImage(StorageFile ImageFile, int maxWidth, int maxHeight)

    IRandomAccessStream inputstream = await ImageFile.OpenReadAsync();
    BitmapImage sourceImage = new BitmapImage();
    sourceImage.SetSource(inputstream);
    var origHeight = sourceImage.PixelHeight;
    var origWidth = sourceImage.PixelWidth;
    var ratioX = maxWidth / (float)origWidth;
    var ratioY = maxHeight / (float)origHeight;
    var ratio = Math.Min(ratioX, ratioY);
    var newHeight = (int)(origHeight * ratio);
    var newWidth = (int)(origWidth * ratio);

    sourceImage.DecodePixelWidth = newWidth;
    sourceImage.DecodePixelHeight = newHeight;

    return sourceImage;

在这种情况下,您只需要调用此任务并显示调整后的图像,如下所示:

smallImage.Source = await ResizedImage(file, 250, 250);

如果你想保留BitmapImage参数由于某些原因(比如sourceImage可能是修改过的位图但不是直接从文件中加载的),并且你想重新调整这张新图片的大小,你会需要先将调整大小的图片保存为文件,然后打开该文件重新调整大小。

【讨论】:

这太好了,谢谢格蕾丝。有没有办法将BitmapImageIRandomAccessStream 转换为WriteableBitmapRenderTargetBitmap 以编码为base64 字符串?我可以直接使用StorageFile,但由于调整大小的图像不是StorageFile,我需要将其恢复为不同的数据类型进行编码。 我最终将整个过程更改为使用WriteableBitmap 而不是BitmapImage,这样我就有了编码为base64 所需格式的图像。我仍然必须在ResizedImage 函数中创建一个BitmapImage 才能获得原始尺寸,但至少它可以工作:) @dubstylee,你做得对,我找不到将BitmapImage 转换为 64base 字符串的方法。要将IRandomAccessStream 转换为WriteableBitmap,可以使用BitmapDecoder,但我想你已经知道了。

以上是关于如何在 Windows 10 UWP 中复制和调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms UWP 项目不会安装在 Windows 10 移动版上

如何在真机(手机)上开发windows 10 uwp?

如何在 Windows 10 和 XBOX One UWP 应用之间使用漫游设置

如何在WPF中调用Windows 10/11 API(UWP/WinRT)

如何在 Windows 10 上的 UWP 中输出到控制台?

在Windows 10 UWP WinJS应用程序中,如何确定构建中包含哪些文件?