これは何ヶ月も私を怒らせてきました: Camera Raw 画像をプレビューするための小さなアプリを持っています。問題のファイルは非常に大きく、低速のネットワーク ドライブに保存される可能性があるため、ユーザーに画像の読み込みを停止する機会を提供したいと考えました。
手軽にこのスレッドを見つけました:
NSOperation で NSData initWithContentsOfURL をキャンセルする
また、Nick の非常に便利な方法を使用してデータをキャッシュし、途中でキャンセル リクエストを発行できるようにしています。
とにかく、使用するデータを取得したら:
NSImage *sourceImage = [[NSImage alloc]initWithData:data];
Nikon .NEF ファイルを見ると問題が発生します。sourceImage
フルサイズではなく、サムネイルのみを返します。Canon .CR2 ファイルと、実際には他の .TIFF と .JPEG を表示すると問題なく表示sourceImage
され、予想されるサイズです。ロードされているデータの量を (NSLog
および で[data length]
) チェックしたところ、すべての Nikon ファイルの 12 MB が-initWithData:
私が使用する場合
NSImage *sourceImage = [[NSImage alloc]initWithContentsOfURL:myNEFURL];
次に、ニコンファイルのフルサイズの画像を取得しますが、もちろんアプリはブロックされます。
したがって、私の人生全体のように感じ始めていることを探し回った後、問題は、ファイルの DPI が 300 であるのに対し、Canon などは 72 であるというニコンのメタデータに関連していることを知っていると思います.
私は解決策がファイルに遅延アクセスすることであることを望みました:
NSImage*tempImg = [[NSImage alloc] initByReferencingURL:myNEFURL];
ここや他の場所で同様の投稿を見たので、単純に一般的な可能な答えを見つけました
[sourceImage setSize:tempImg.size];
もちろん、これは小さなサムネイルのサイズを 3000x2000 程度に変更するだけです。
私は、.NEF から全体像を把握する方法を提供することを期待して、次のことをいじっています。
CGImageSourceRef isr = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
CGImageRef isrRef = CGImageSourceCreateImageAtIndex(isr, 0, NULL);
と
NSBitmapImageRep *bitMapIR = [[NSBitmapImageRep alloc] initWithData:data];
ただし、これらのサイズを確認すると、サムネイルの幅と高さが似ています。実際、isrRef
4.2 分の 1 のさらに小さいサムネイルを返します。おそらく、300 / 72 == 4.2 であることに注意する価値があるためisrRef
、DPI (おそらく) が既に観察されている画像の DPI を考慮に入れています。
お願いします!誰かが私の悲惨な状態から抜け出し、ロードされたデータからフルサイズの画像を取得するのを手伝ってくれませんか?!?! 現在、ファイル拡張子で大文字と小文字を区別しない検索を使用して NEF ファイルを特殊ケース化してから、ブロック メソッドを使用して URL をロードしています。アプリのブロックにヒットする必要があり、長い目で見れば、検索は絶対確実ではありません。
余談ですが、これは実際には OS のバグですか? メソッドはさまざまなエンジンを使用して実際に画像をレンダリングするように見えますNSImage's -initWithData:
。でクラスに提示されたかのようにレンダリングされるデータを単にロードする-initWithContentsOfURL:
と仮定するのは合理的ではないでしょうか?-initWithURL:
-initWithData: