質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

1回答

2705閲覧

Photos frameworkを使ってアルバムからオリジナルサイズの画像を取得する際に、端末にどれだけメモリがあれば良いのか知りたい

izuki_y

総合スコア65

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2017/03/23 12:24

はじめに

いつもお世話になっています。
表題の件で質問があります。

iOS端末(iPhone/iPod touch) で 超巨大JPEG画像(24000x24000)を読み込む必要がありPhoto frameworkを使って以下の様な簡略化したコードで読み込ませてみたのですがUIImage=nilで返ってきて取得できません。

Objective

1 2PHAsset *myPHAsset; 3PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:myAssetCollection options:nil]; 4if (assets.count == 0) { 5 /* nothing */ 6} 7else { 8 [assets enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 9 myPHAsset = (PHAsset *)obj; 10 }]; 11} 12 13UIImage *originalImage = nil; 14PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; 15options.synchronous = YES; 16options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; // サイズ通りの画像を引っ張ってくる 17 18[[PHImageManager defaultManager] requestImageForAsset:myPHAsset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { 19 originalImage = result; 20 NSLog(@"result %dx%d", result.size.width, result.size.height); 21}];

以下の様なエラーメッセージがでます。

CGBitmapContextInfoCreate: unable to allocate 2304000000 bytes for bitmap data

iPhoneのメモリが足りないのでエラーになっているのはエラー文から何となくわかるのですが、
Jpegの画像を引っ張って来ているのに bimap data とか言われるのがよく分かりません。
JPEGデータだけであるのであれば使用している画像だと10Mbyteも無いはずなので・・・・。

これはJpeg を取ってくるときに Jpeg -> bitmap -> Jpeg とPhotos frameworkがデコードをしているのでしょうか?
どの様な展開の仕方をしているのか知りたいので教えてください。
CGBitmapContextInfoCreateなんてメソッドも存在しないですし・・・。

またこの画像を開くためには端末にどれだけのメモリが必要なのでしょうか?

回答をご指示ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

UIImageは、内部でCGImageを使用して画像データを管理しており、CGImageはビットマップで画像データを管理しています。

https://developer.apple.com/jp/documentation/drawingwithquartz2d.pdf
の「ビットマップグラフィックスコンテキストの生成」あたりを読んで理解しておくことをお勧めします。
ビットマップは、通常1ピクセルあたり4バイトのデータで構成されていますので、
24,000x24,000x4=2,304,000,000バイト
つまり、2Gバイト以上のメモリを必要とします。

iPhone7のDRAMメモリ搭載量は2Gバイトですので、この画像全体をUIImageにすることはできません。画面に表示できればいいだけであれば、画面サイズに落として読み込めばいいのでrequestImageForAssettargetSize指定を画面サイズ程度にすれば読み込めるかもしれません。

24000x24000のサイズを落とさないまま読み込んで処理したいのであれば、その画像を縦10分割×横10分割(=100分割)くらいに分割して、少しずつ読み込んで処理するしかないかと思います。
ただ、Appleが提供しているUIImageやCGImageにそのような分割読み込み機能があるかどうかは、私は調べたことありません。もしかしたら、外部の画像処理ライプラリを使用するか、自前でjpegファイル形式を解析しながら画像ファイル読み込みする必要があるかもしれません。

投稿2017/03/24 02:42

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izuki_y

2017/03/28 13:48

回答ありがとうございます。 やはりBitmapにしていたのですね。 > UIImageは、内部でCGImageを使用して画像データを管理しており、CGImageはビットマップで画像データを管理しています。 手元にあるソースを変更していただけだったのでこれは始めて知りました。 画像を他のデバイスに渡す必要があるので画像サイズは落とす事は出来ないのでどうしたものかと考えています(Jpeg -> bmp に変換した時点でオリジナルとは違うと思うますが・・・) このリソースをどうやって使っていくかはもう少し調べてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問