【问题标题】:NSImage's drawingHandler and retina screensNSImage 的绘图处理程序和视网膜屏幕
【发布时间】:2014-10-09 09:49:34
【问题描述】:

我知道,当使用以下 sn-p 创建图像并将它们分配给视图层的内容时,当视图的支持属性发生更改时,渲染块会自动再次执行,即窗口移入或移出视网膜显示器.

[NSImage imageWithSize:size flipped:NO drawingHandler:^BOOL(NSRect rect) {
    CGContextRef const context = NSGraphicsContext.currentContext.graphicsPort;
    ....
    return YES;
}];

在这个渲染块中,我试图将另一个 NSImage 垂直居中。我希望这在高分辨率显示器上看起来尽可能居中,但在非视网膜屏幕上不会模糊。因此,我想知道是否有任何方法可以找出渲染图像的 contentScaleFactor。

这应该很简单,但即使经过数小时的尝试和搜索互联网,我也没有找到一种方法来确定图像是否正在为视网膜屏幕呈现。

【问题讨论】:

    标签: retina-display nsimage


    【解决方案1】:

    来自High Resolution Guidelines for OS X: APIs for Supporting High Resolution — Getting Scale Information

    CGContextRef

    获取 CGContext 缩放信息的首选方式 对象是调用转换函数 CGContextConvertRectToDeviceSpace:

    deviceRect = CGContextConvertRectToDeviceSpace(context, userRect);
    

    然后你可以将deviceRect.size.height除以 userRect.size.height。这适用于隐式缩放窗口 上下文和显式缩放的位图上下文。

    不过,我实际上并不认为您应该计算比例。我认为您应该将rect 参数从用户空间转换为设备空间到您的绘图处理程序和使用任意原点构造的矩形(NSZeroPoint 可以)以及您尝试居中的图像大小.调整后者的原点,使其在设备空间中以数学方式居中于前者。使用NSIntegralRectWithOptions() 对结果进行积分。然后,使用CGContextConvertRectToUserSpace() 将其转换回用户空间。将图像绘制到生成的矩形中。

    【讨论】:

      【解决方案2】:

      我认为可以通过

      CGFloat const scale = CGBitmapContextGetWidth(context) / rect.size.width;

      但是,我认为这不是一个好的解决方案,应该/必须有更好的解决方案。

      【讨论】:

        猜你喜欢
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多