【问题标题】:Getting co-ordinates of bitmap on mouseDown in NSImageView在 NSImageView 中的 mouseDown 上获取位图的坐标
【发布时间】:2013-06-01 12:48:55
【问题描述】:

我正在开发一个显示不受支持的(由 XCode)文件格式的应用程序。所以我将NSBitmapImageRep 子类化为在NSImaageView 的子类中显示它。我已将其设置为可按比例缩放(向上或向下)。现在我需要添加一种在位图中获取像素坐标的可能性。所以我已经 ovveride 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。你知道我应该怎么做吗?

【问题讨论】:

    标签: objective-c cocoa pixel nsimageview nspoint


    【解决方案1】:

    您需要一个图像矩阵视图。它是一个将视图坐标映射到图像坐标的矩阵。通常是比例和平移的结合。

    首先,您需要决定是否要缩放图像以使其完全可见但适合窗口,或者使其完全填满窗口。 (或者还有其他选项,例如无论窗口大小始终以 1:1 显示图像。)这将决定图像的比例。

    接下来,您需要决定如何定位缩放后的图像。如果您将其缩放为始终适合窗口,并且有填充,您是偏爱窗口的左侧和顶部,还是总是尝试将其居中?如果它被缩放以始终填满窗口,它是在窗口中垂直居中还是水平居中?还是图像的原点总是显示在窗口的左下方?

    计算出比例并进行平移后,您就可以从其中 2 个矩阵中组合出一个矩阵。完成此操作后,获取矩阵的逆矩阵,这会将您的视图坐标转换为图像像素。

    【讨论】:

    • 感谢您的回答,但我认为这项任务不会那么复杂。请更详细地解释一下“得到矩阵的逆”是什么意思。也许有一个第 3 方库来逐个像素地管理图像(当然还有在 mouseDown 上获取它们的坐标)?你知道吗?
    • 如果你有一个变换矩阵,它将坐标从一个空间变换到另一个空间。矩阵的逆将它们转换回来。但在这种情况下,您不需要使用完整矩阵。您只需要缩放和翻译。如果您有向一个方向移动的比例和平移,只需反转比例并减去向另一个方向移动的平移。
    • 谢谢。我现在正在研究它,并认为它会起作用。顺便说一句,locationInWindow 方法在关联窗口的基本坐标系中返回 NSPoint 对象,而不是在 NSImageView 的基础坐标系中(这是在文档中,但我一开始没有意识到)。再一次 - 谢谢!
    猜你喜欢
    • 2013-11-26
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多