代码之家  ›  专栏  ›  技术社区  ›  KamyFC

可可粉点到石英点-倒装堇青石

  •  0
  • KamyFC  · 技术社区  · 8 年前

    在macOS编程中,我们知道

    • Quartz使用坐标空间,原点(0,0)位于主显示的左上角。增加y会下降。
    • Cocoa使用一个坐标空间,其中原点(0,0)位于主显示的左下角,并且y向上增加。

    现在我使用Quartz API-CGImageCreateWithImageInRect来裁剪一个图像,它以一个矩形作为参数。rect的Y来源于Cocoa的mousedown事件。

    所以我在倒转的地方种庄稼。。。

    我试着用这个代码在cropRect中翻转Y坐标

     //Get the point in MouseDragged event
     NSPoint currentPoint = [self.view convertPoint:[theEvent locationInWindow] fromView:nil];
     CGRect nsRect = CGRectMake(currentPoint.x , currentPoint.y,   
                                      circleSizeW,  circleSizeH);
     //Now Flip the Y please!
     CGFloat flippedY = self.imageView.frame.size.height - NSMaxY(nsRectFlippedY);
     CGRect cropRect = CGRectMake(currentPoint.x, flippedY, circleSizeW, circleSizeH);
    

    但是对于顶部的区域,我错了翻转坐标。 如果我在视图的上边缘附近单击,我将翻转y=510到515 顶部边缘应在0到10之间:-|

    有人能给我指一个正确可靠的翻转方法吗 在这种情况下Y坐标?谢谢您!

    以下是GitHub中的示例项目,重点介绍了这个问题 https://github.com/kamleshgk/SampleMacOSApp

    ISSUE Screenshot

    2 回复  |  直到 8 年前
        1
  •  1
  •   Ken Thomases    8 年前

    正如Charles所提到的,您正在使用的核心图形API需要相对于图像(而不是屏幕)的坐标。重要的是将事件位置从窗口坐标转换为与图像位置最接近的视图,然后将其相对于同一视图的边界(而不是帧)翻转。所以:

    NSView *relevantView = /* only you know which view */;
    NSPoint currentPoint = [relevantView convertPoint:[theEvent locationInWindow] fromView:nil];
    // currentPoint is in Cocoa's y-up coordinate system, relative to relevantView, which hopefully corresponds to your image's location
    
    currentPoint.y = NSMaxY(relevantView.bounds) - currentPoint.y;
    // currentPoint is now flipped to be in Quartz's y-down coordinate system, still relative to relevantView/your image
    
        2
  •  0
  •   Charles Srstka    8 年前

    你传递给的矩形 CGImageCreateWithImageInRect 应该是相对于输入图像大小的坐标,而不是屏幕坐标。假设输入图像的大小与已将点转换为的视图的大小匹配,则应该可以通过从图像的高度(而不是屏幕高度)减去矩形的角来实现此目的。