2012-07-25 12 views
9

大きな画像はメモリに読み込むには大きすぎますが、大きな画像の中のサブセットにしか興味がありません。このピクセルのサブセットのみをメモリにデコードすることは可能ですか?私は今、私がやっている... Androidの中で、これはBitmapRegionDecoderは私がCGDataProviderCreateSequentialを発見したios画像の一部をデコードする

のようなものですが、それは、コンストラクタの生のピクセルを必要と呼ばれる正確に行うためのAPIでクラスがあることを

を知っていますこのような何か:あなたはCGImageSourceCreateWithData()(またはURL何でも)を作成する場合、これはうまくいくかもしれない

UIImage* srcImage = ...; 
    CFDataRef cgImgDataRef = CGDataProviderCopyData(CGImageGetDataProvider(srcImage.CGImage));//After this call, all pixels are decoded into memory and the app crashes 
char* imageData = (char*)CFDataGetBytePtr(cgImgDataRef); 
+0

現在の知恵では、これを行う方法は、画像をタイルにスライスし、適切なズームレベルで現在表示されているタイルのみを遅延ロードすることです。この画像は正確にどのくらいの大きさ(ピクセルの大きさ)ですか? – warrenm

+0

およそ4096x3072ですが、私は大きな画像のタイルを開いているgl ESアプリに直接ロードしたいと思っています。だから、私は必要なピクセルを抽出し、私のサブピクセルデータとのglTexImage2D(...)を呼び出す必要があります – AkademiksQc

+0

サブ画像のサイズは、あなたは常に同じ抽出しているのですか、またはそれは異なりますか?範囲は何ですか? – warrenm

答えて

10

唯一可能な方法があるが、その後、CGImageCreateWithJPEGDataProviderまたはCGImageCreateWithPNGDataProviderを使用してCGImageRef作成します。そのCGImageRefでは、CGImageCreateWithImageInRect()を使用して大きなイメージのサブセクションを引き出すことができます。

あなたがしようとしているのは画像をタイルしている場合は、私はあなたのために多くの情報を持っているようにあなたの質問を明確にしてください。

+0

うわー、実際に働いている!以前は[UIImage imageNamed ...]を使ってjpegデータをロードしていました。 CGImageCreateWithJPEGDataProvider + CGImageCreateWithImageInRect()は必要な部分だけをデコードするようです。今はメモリが足りずにいつもクラッシュする前に動作します。これらの方法についてさらに説明があるかどうかを調べるために、ドキュメントをチェックします。あなたの情報のために、目標はディスクから大きなイメージを読み込んで、それをopenglに送信することです。デバイス上でサポートされている最大OpenGLテクスチャサイズに応じてタイルする必要があります – AkademiksQc

+0

本当に巨大なJPEGの場合、libjpeg-turboを使用し、armv7アクセラレーションにNEONを使用するオープンソースの自由に利用できるライブラリです。私はPhotoScrollerNetworkプロジェクトでそれを使って電話で18000x18000のNASA画像をタイル表示します! –

+0

私はそれを調べます...しかし、それはソフトウェアのデコードだけではありませんか?私は組み込みのjpegハードウェアデコーダのためにios SDKを使用しなければならないと思った。 – AkademiksQc

関連する問題