2013-11-09 13 views
11

さまざまな倍率で画像を検査するために使用できるアプリケーション用の画像「ルーペ」を作成しようとしていますが、少しばかりのロードバンプが発生しました。私はQuartzを使用して、アプリケーションのウィンドウが表示されているディスプレイの選択された部分のCGImageRefスナップショットを作成しています。問題は、さまざまなOS X技術のすべてで使用されている命名法が私には本当に混乱しているということです。Objective-C(OS X)では、Quartz Display ServicesがCocoaの「画面」座標空間と同じ「グローバルディスプレイ」座標空間ですか?

私が使用している機能はCGDisplayCreateImageForRect(CGDirectDisplayID display, CGRect rect)です。ドキュメントにはCGRect rectのパラメータが "の表示スペースで指定された矩形で、ディスプレイに表示される部分が画像にコピーされています。問題は、私のコンソールに出力されている出力が私が期待していたものではないということです。私は今では100%混乱しているので、非常に多くの異なる変換、変換、coordのフリップなどを試みました。

私の質問は次のとおりです。スクリーンスペース==デバイススペース==ディスプレイスペースと、どのようにして自分のビューのフレーム(カスタムボーダーレスウィンドウになる)が正しく変換されるか左下の原点)を使ってディスプレイの座標(左上の原点)に一致させますか?

誰かが私をまっすぐにしたり、正しい方向に向けることができたら、私は永遠に感謝しています。ありがとう!

答えて

15

クォーツは、原点(0、0)がプライマリディスプレイの左上にある座標空間を使用します。 yの増加は減少する。

ココアは原点(0、0)がプライマリディスプレイの左下にあり、yが上がる座標空間を使用します。

あなたがそうのようなココアからクォーツに、ウィンドウの枠を変換することができます:

NSRect frame = window.frame; 
frame.origin.y = NSMaxY(NSScreen.screens[0].frame) - NSMaxY(frame); 
CGRect quartzRect = NSRectToCGRect(frame); 

注:あなたは常にプライマリスクリーンを使用し、ウィンドウの-screenを使用しないでください。

これは、ウィンドウ座標の矩形です。ビュー内の四角形については、最初に-[NSView convertRect:toView:]nilを使用してウィンドウを示すビュー座標からウィンドウ座標に変換します。これは、ビューのフレームがスーパービューの座標系にあるため、someView.boundsの場合は正しく、someView.frameの場合は正しく処理されません。

+0

ありがとう、ケン。私は何千もの 'NSLog()'呼び出しを含む)すべてをコメントアウトし、ゼロから始めて問題を修正しました。私の最大の問題は、私が非常に多くのコンバージョンを行っていて、フリップを調整していて、もう一方をキャンセルするということでした。私は本当にあなたの内訳に感謝します。私は境界/フレームの違いについて決して考えなかった。それはおそらく私が間違っていた場所です。残っている唯一の質問は、「画面スペース」は「デバイススペース」と同じですか?そして、それらは「グローバルディスプレイスペース」と同義ですか?私は私の耳の間に大きな空間があると思っています。 :-( –

+5

"デバイススペース"とはピクセルを指し、その起源はデバイスに特有のものが多い "ローカルディスプレイスペース"はポイントを使用するが、その起点は特定のディスプレイの左上にある。すべてのディスプレイが配置されている座標空間原点はプライマリディスプレイの左上にあります「スクリーン空間」は原点を原点としたココア座標空間です –

+1

まあ、 –

関連する問題