2012-01-12 5 views
2

現在、次のコードを使用して、iOSアプリケーションのALAssetからUIImageを取得しています。CGImageRefの最大サイズをALAssetRepresentationから設定する

ALAssetRepresentation *rep = [self.asset defaultRepresentation]; 
CGImageRef ref = [rep fullResolutionImage]; 
ALAssetOrientation orientation = [[self.asset valueForProperty:@"ALAssetPropertyOrientation"] intValue]; 
UIImage *image = [UIImage imageWithCGImage:ref scale:1.0 orientation:(UIImageOrientation)orientation]; 

これは、画像がかなり小さい(たとえば、カメラのカメラで撮影されている)限り、非常に効果的です。しかし、画像は(6000px^2以上)が大きすぎる場合、アプリはこのステップ中にメモリ不足になります:アプリがクラッシュしたり(理想的には)を設定する前に

CGImageRef ref = [rep fullResolutionImage]; 

を、私はこの状態を検出したいと思います返されるイメージの最大サイズ。

私は、fullScreenImageが小さい画像を返すことに気づいていますが、拡大するためには画像よりもはるかに高い解像度が必要です。

さらに、JPGなど圧縮率の高いフォーマットは圧縮されたサイズでは十分に小さいかもしれませんが、ピクセル単位のサイズが大きければメモリを消費しすぎる可能性があるため、アセットのバイトサイズを使用することは信頼性がありません)。

イメージのサイズを取得してこの状況を事前に検出して、読み込みをキャンセルしてエラーを表示する方法や、そのような大きなアセットの小さなバージョンを取得する方法についてのご意見をいただければ幸いです。

答えて

2

更新:

コメントの中でいくつかの議論の後に。

あなたはコール

[asset metadata] 

私が見つけた参照して、ファイル/資産のExifの情報を得ることができますが、ページは、個々のプロパティを取得する方法を示し、ここでsarofox.alasset-image-metadata です。 これにより、ファイル/アセットを開く前にピクセルサイズを取得できるようになります。

MY OLD ANSWER:いずれかのアイデアが参考に見つけた場合には

は、以下の通りです:

これが唯一の推測です。 しかし、あなたは使用できませんALAssetRepresentation getBytes:fromOffset:length:error:

デバイスカメラのイメージが期待するバイトサイズを使用します。

ファイルのファイルサイズの先頭からfromOffsetを指定してチェックを実行します。そして、ファイルサイズの(必要な最大)終了までの長さ。

バッファ内のサイズを読み取ります。それが要求よりも小さい場合は、あなたは大丈夫です。 それは要求された範囲とまったく同じである場合、(それは多分大きな。)ファイルにより左があるかもしれない

もしそうなら、GetBytesメソッドの新しい要求を実行します。fromOffset:長さ:エラー: *この最後のリクエストの長さと新しい長さからfromOffsetを使って時刻を返します。

結果を追加して、ファイル全体が大きすぎるかどうかを判断できます。

バッファ/ファイルが大きすぎることはありません

+0

ありがとうございます。問題は、圧縮されたイメージのファイルサイズが無関係であることです。たとえば、白だけを含む6000px * 6000pxのPNGは、バイト単位では非常に小さいサイズを持ちますが、一度圧縮されて表示されると非常に大きくなります。 – 0x90

+0

投影されたピクセルサイズを取得したいので参照してください – markhunte

+0

はい。私はこれをより明確にするために質問を更新しました。それを指摘してくれてありがとう。 :) – 0x90

関連する問題