2011-12-04 11 views
1

私はスクリーンショットを撮りたいと思う非常に大きなビュー(〜8000x8000)を持っていますが、アプリケーションはスクリーンショットコードの1/4を終了して終了します。iOSのコアグラフィックスで非常に大きな画像を処理する

// Render the view into a bitmap 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef ctx = CGBitmapContextCreate(NULL, 
             _document.size.width, 
             _document.size.height, 
             8, 0, colorSpace, 
             kCGImageAlphaPremultipliedLast); 

// Convert the UI space to CG space 
CGContextScaleCTM(ctx, 1, -1); 
CGContextTranslateCTM(ctx, 0, -_document.size.height); 

// Render the view 
[_contentView.layer renderInContext:ctx]; 
CGImageRef screenshot = CGBitmapContextCreateImage(ctx); 

// Cleanup 
CGContextRelease(ctx);  
CGColorSpaceRelease(colorSpace); 

明らかにメモリのたくさんを使用するようになるだろう:コードは次のようになります。誰も非常に大きな画像とコアグラフィックを扱うトリックを持っていますか?

答えて

2

イメージ全体を一度にレンダリングしないで、500x8000の「バンド」をレンダリングし、書き出して解放し、16回繰り返します。

+0

はい、私はその考えが好きですが、私はrenderInContextは「renderRect」タイプの機能を持っていることを期待しています。また、どのようにレンダリングされたタイルをすべて一緒にステッチしますか?*それらをメモリに読み込まずにどうしますか? – Ralphleon

+0

Um ....読み込み専用mmap(2)は、メモリの過剰使用のためにプロセスが終了する目的で "メモリ"としてカウントされないことがあります。多分。他のオプションがない場合は試してみる価値があります。 – Stripes

+0

タイルは、メモリではなくディスク上で直接縫い合わせることができます。この方法は、プロセスを制御できるため、受け入れた方法よりも優れています。また、実際にPDFが必要ない場合は、おそらく高速です。 –

関連する問題