2009-06-03 8 views
0

メモリを割り当てようとしています NSImage * originalLocationImage;700MB〜800MBのメモリを割り当てたい画像サイズ

NSURL * fileURL = [NSURL fileURLWithPath:originalLocation]; //元の場所は、ディスク内のファイルパスです。

originalLocationImage = [[NSImage alloc] initByReferencingURL:fileURL];

NSBitmapImageRep *sourceRep = [[NSBitmapImageRep alloc]initWithData:[SourceImage TIFFRepresentation]] //this line fails to allocate memory 

と、それは大きな画像/

のために失敗し、それが正常に動作する小さな画像のエラー

malloc: *** mmap(size=268435456) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 

をスローします。

任意のヘルプ??

答えて

1

私は最初にすべての画像をメモリにロードしたいのですが、それは確かにタイルセットのようなものを扱うほうが良い選択でしょうか?

あなたはこのくらいのメモリ空きがあるかもしれない一方で、あなたが望むすべてがプレビューである場合、あなたはでラインを読むことができた

+0

その後、私はそのイメージのプレビューを作成したいので、それを行うためのより良い方法があります。私はたくさんのことを試みましたが、今は何の方法も見つけられませんでした。 – ashish

1

無料このくらい連続しメモリを持っていない、ので、あなたがこのメッセージを得ています行ごとに、n行おきにスキップし、行ごとに、nピクセルごとにスキップします。必要に応じてより洗練されたスケーリングアルゴリズムを通過できる、より小さなイメージを残しておくか、サムネイルイメージなどで保存するだけです。

+0

あなたの提案されたソリューションはいいと思うけど、フォーマットが圧縮されている可能性があるのでバイナリスキップ入力できません - 圧縮解除して、圧縮解除された出力からデータをスキップする必要があります。 – diciu

+0

はい、チャンクで解凍することはできますが、画像全体を読む必要はありません。 – Blindy

2

libjpegを使用すると、16:http://jpegclub.org/djpeg/まで最適化されたサブスケーリングを行うことができるようです。

libjpegはプレーンCなので、Objective-Cから呼び出すことができます。

+0

このコード行に問題があります。 画像1 GBサイズのpsdがうまく動作しました。 NSBitmapImageRep * sourceRep = [[NSBitmapImageRep alloc] initWithData:[SourceImage TIFFRepresentation]] //この行はメモリの割り当てに失敗します この場合のメモリの割り当て方法については、 をお勧めします。 – ashish

+0

追加エラー私はTIFF画像のために取得しています :tiffデータプロバイダ:タグ値をフェッチするスペースがありません。 – ashish

+0

コードの同じclineが1 GBのPSDの画像をロードする場合、なぜtiffではないのですか? – ashish

0

イメージのプレビューだけを作成したい場合、CGImageSourceにはそのためのAPIがあります。彼らは非常に最初であり、画像全体をメモリに読み込む必要はありません。

+0

このクラスについて教えて頂くまでのボディはありません。さまざまなサイズと解像度のプレビューを作成することはできますか? – ashish