NSImage的绘图处理程序和视网膜屏幕



我知道,当使用以下片段创建图像并将其分配给视图的层内容时,当视图的后台属性发生变化时,即窗口移动到视网膜显示器或从视网膜显示器移动时,渲染块会自动再次执行。

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

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

这应该很简单,但即使在互联网上尝试和搜索了几个小时后,我也没有找到一种方法来确定图像是否是为视网膜屏幕渲染的。

来自OS X的高分辨率指南:支持高分辨率的API——获取规模信息:

CGContextRef

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

deviceRect = CGContextConvertRectToDeviceSpace(context, userRect);

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

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

我认为它可以通过实现

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

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

最新更新