我使用http://www.codeproject.com/Tips/552141/Csharp-Image-resize-convert-and-save中的代码以编程方式调整图像大小。但是,该项目使用的System.Drawing
库是Windows 10应用程序无法使用的。
我尝试使用BitmapImage
中的Windows.UI.Xaml.Media.Imaging
类,但它似乎没有提供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
,我想创建一个新的/副本来修改和返回。
答案 0 :(得分:8)
我可能想要返回原始
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可能是修改后的位图但不是直接从文件加载),并且您想要将这个新图片重新调整为另一个,您需要首先将重新调整大小的图片保存为文件,然后打开此文件并重新调整大小。