2013-06-01 1 views
0

Я работаю над приложением, в котором я показываю неподдерживаемый (по XCode) формат файла). Поэтому я подклассифицировал NSBitmapImageRep, чтобы отобразить его в подклассе NSImaageView. Я настроил его на пропорциональное масштабирование (вверх или вниз). Теперь мне нужно добавить возможность получить координаты пикселя в растровом изображении. Так что я ovveride MouseDown: метод:Получение координат растрового изображения на mouseDown в NSImageView

- (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 возвращает NSPoint из NSImageView , а не битмап, который обычно меньше и имеет неиспользованные поля в NSImageView, но я могу нажать на поле, а событие mouseDown возвращает мне NSPoint в этом поле. Вы знаете, что я делаю?

ответ

0

Вам необходимо изображение для матрицы изображений. Это матрица, которая отображает координаты координат в координаты изображения. Обычно это будет комбинация масштаба и перевода.

Сначала вам нужно решить, хотите ли вы масштабировать изображение, чтобы оно было полностью видимым, но вписывалось в окно или так, чтобы оно полностью заполняло окно. (Или есть другие варианты, например, всегда показывать изображение в 1: 1 независимо от размера окна.) Это определит масштаб изображения.

Далее вам нужно решить, как разместить масштабированное изображение. Если вы масштабируете его, чтобы всегда вписываться в окно, и есть прокладка, вы предпочитаете левую и верхнюю часть окна или всегда пытаетесь центрировать его? ЕСЛИ это масштабируется, чтобы всегда заполнять окно, оно центрировано по вертикали или по горизонтали в окне? Или источник изображения всегда отображается в левом нижнем углу окна?

Как только вы вычислили масштаб и перевели, вы можете составить одну матрицу из 2 из них. Как только вы это сделаете, получите обратную матрицу, и это преобразует ваши координаты представления в пиксели изображения.

+0

Спасибо за ваш ответ, но я подумал, что эта задача будет менее сложной. Пожалуйста, объясните мне более подробно, что вы имеете в виду «получить обратную матрицу». Может быть, есть сторонние библиотеки для управления изображениями по пикселям (и получение их координат на mouseDown, конечно)? Вы знаете что-нибудь? – zioolek

+0

Если у вас есть матрица преобразования, она преобразует координаты из одного пространства в другое. Обратный матрица преобразует их обратно. Но в этом случае вам не нужно использовать полную матрицу. Вам нужен только масштаб и перевод. Если у вас есть масштаб и перевод, чтобы идти в одном направлении, просто инвертируйте масштаб и вычтите перевод для перехода в другом направлении. – user1118321

+0

Спасибо. Сейчас я работаю над этим и думаю, что он сработает. Кстати, метод locationInWindow возвращает объект NSPoint в базовой системе координат связанного окна, а не NSImageView (это в документации, но я не понимал этого в первый момент). Еще раз - спасибо! – zioolek