あなたがツイッターで言ったことはあなたの質問と一致しません。
メモリ スパイクが発生している場合は、Instruments を見て、メモリを消費しているものを特定します。高解像度画像のデータだけでも 10 メガであり、アルファ チャネルが含まれていない場合、結果の画像は約 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
もう 1 つのオプションは、スケーリングを 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);
}