你在推特上说的和你的问题不符。
如果您遇到内存峰值,请查看 Instruments 以找出消耗内存的内容。仅高分辨率图像的数据为 10 兆,如果不包含 alpha 通道,则生成的图像将约为 750k。
第一个问题是保持较低的内存使用率,为此,请确保您加载的所有图像在使用完毕后立即释放,这将确保底层 C/Objective-C API 立即释放内存,而不是等待 GC 运行,所以类似于:
using (var img = UIImage.FromFile ("..."){
using (var scaled = Scaler (img)){
scaled.Save (...);
}
}
至于缩放,有多种缩放图像的方法。最简单的方法是创建一个上下文,然后在其上绘制,然后将图像从上下文中取出。MonoTouch 的 UIImage.Scale 方法是这样实现的:
public UIImage Scale (SizeF newSize)
{
UIGraphics.BeginImageContext (newSize);
Draw (new RectangleF (0, 0, newSize.Width, newSize.Height));
var scaledImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return scaledImage;
}
性能将由您启用的上下文功能控制。例如,更高质量的缩放将需要更改插值质量:
context.InterpolationQuality = CGInterpolationQuality.High
另一种选择是不在 CPU 上运行缩放,而是在 GPU 上运行。为此,您将使用 CoreImage API 并使用 CIAffineTransform 过滤器。
至于哪个更快,留给别人去衡量
CGImage Scale (string file)
{
var ciimage = CIImage.FromCGImage (UIImage.FromFile (file));
// Create an AffineTransform that makes the image 1/5th of the size
var transform = CGAffineTransform.MakeScale (0.5f, 0.5f);
var affineTransform = new CIAffineTransform () {
Image = ciimage,
Transform = transform
};
var output = affineTransform.OutputImage;
var context = CIContext.FromOptions (null);
return context.CreateCGImage (output, output.Extent);
}