2013-06-01 42 views
0

我正在一個應用程序,我顯示不支持(通過XCode)文件格式)。所以我已將子類別NSBitmapImageRep顯示在NSImaageView的子類中。我已將它設置爲按比例縮放(向上或向下)。現在我需要添加一個可能性來獲取位圖中像素的座標。所以我ovveride鼠標按下:方法:在NSImageView中獲取位圖座標mouseDown座標

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    NSLog(@"mouseDown: %ld", [theEvent clickCount]); 
    NSPoint point = [theEvent locationInWindow]; 
    NSLog(@"point x: %f and y: %f", point.x, point.y);  
} 

越來越NSPoint後,我應該嘗試將其轉換爲負責協調的位圖,但首先我不知道如何解決locationInWindow返回NSImageViewNSPoint問題,而不是在NSImageView中的位置非常小且沒有使用邊距的位圖,但是我可以點擊邊距並且mouseDown事件返回該邊距中的NSPoint。你知道我應該做什麼嗎?

回答

0

你需要一個視圖來映像矩陣。這是一個將視圖座標映射到圖像座標的矩陣。通常這將是規模和翻譯的結合。

首先,您需要決定是否縮放圖像,使其完全可見,但適合在窗口內或完全填滿窗口。 (或者還有其他選項,比如不管窗口的大小如何,總是以1:1顯示圖像。)這將決定圖像的比例。

接下來,您需要決定如何定位縮放圖像。如果您將它縮放爲始終適合窗口,並且有填充,那麼您是傾向於窗口的左邊還是上邊,還是始終嘗試將其居中?如果縮放比例始終填滿窗口,它是垂直居中還是水平居中在窗口中?或者圖像的來源始終顯示在窗口的左下角?

一旦你找出了尺度和平移,你可以從它們中的2個構成一個矩陣。一旦你完成了,得到矩陣的逆矩陣,這將把你的視圖座標轉換成圖像像素。

+0

謝謝你的回答,但我認爲這項任務不會那麼複雜。請更詳細地解釋我是什麼意思「得到矩陣的逆矩陣」。也許有第三方庫來逐像素地管理圖像(當然,獲得它們在mouseDown上的座標)?你知道任何? – zioolek

+0

如果您有一個變換矩陣,它將座標從一個空間轉換到另一個空間。矩陣的逆矩陣將它們轉換回來。但在這種情況下,您不需要使用完整的矩陣。你只需要縮放和翻譯。如果您的比例尺和平移向一個方向進行,只需反轉比例尺並減去平移量即可沿另一個方向進行。 – user1118321

+0

謝謝。我正在研究它,並認爲它會起作用。順便說一句,locationInWindow方法返回NSPoint對象在相關窗口的基本座標系中,而不是NSImageView(這是在文檔中,但我在第一時間沒有意識到)。再一次 - 謝謝! – zioolek