4

Macプロジェクトに2つのPNGがあります。通常および@2x。Xcodeは、これらを1つのTIFFに結合し、@ 2xはインデックス0にあり、@1xはインデックス1にあります。

現在の表示スケールのCGImageRefバージョン(Quartzで使用)として適切な画像を取得するための推奨されるアプローチは何ですか?

CGImageSourceを介して手動で画像を取得できます。

NSBundle *mainBundle = [NSBundle mainBundle];
NSURL *URL = [mainBundle URLForResource:@"Canvas-Bkgd-Tile" withExtension:@"tiff"];

CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)(URL), NULL);
_patternImage = CGImageSourceCreateImageAtIndex(source, 1, NULL);  // index 1 is @1x, index 0 is @2x
CFRelease(source);

これも機能していることがわかりましたが、RetinaディスプレイにRetinaバージョンが返されるかどうかはわかりません。

NSImage *patternImage = [NSImage imageNamed:@"Canvas-Bkgd-Tile.tiff"];
_patternImage = [patternImage CGImageForProposedRect:NULL context:nil hints:nil];
CGImageRetain(_patternImage); // retain image, because NSImage goes away

この質問に対する許容できる答えは、組み合わせた多重解像度TIFFからCGImageを適切に取得する方法を提供するか、ここで2番目のアプローチが機能する理由を説明します。または、どのような変更が必要か。

4

1 に答える 1

1

私は「なぜここでの2番目のアプローチが機能しているのか」について答えることを選びます。

2010年以降に公開されたWWDCビデオの1つで、彼らは次のように述べています。

+ [NSImage imageNamed:]は、現在の表示に使用できる最適な画像表現オブジェクトを選択します。

したがって、ロックされたフォーカスコンテキスト内(たとえば、drawRect:メソッド内など)からこのクラスメソッドを呼び出しているか、実際に自分でlockFocusを呼び出している可能性があります。とにかく、結果はあなたが最も適切な画像を得るということです。ただし、+ [NSImage imageNamed:]を呼び出す場合のみ。

編集:ここで見つけました:http: //adcdownload.apple.com//wwdc_2012/wwdc_2012_session_pdfs/session_213__introduction_to_high_resolution_on_os_x.pdf

スライドで「最高」というキーワードを検索します:「NSImageは自動的に最高の表現を選択します[…]」。

したがって、2番目のバージョンはRetinaディスプレイにRetinaバージョンを返します。確かに、ドキュメント[*]で宣伝されています。

[*]これは、有効なアートワークを提供した場合にのみ機能します。

于 2013-02-22T23:18:13.177 に答える