3

我从磁盘加载图像(NSImage),并将其绘制到 MAC 上的 NSImageView 上,没问题图像看起来很清晰。

将其绘制到 NSImageView 后,我用相同的图像调用下面的函数,然后将返回的值绘制到相同的 NSImageView。结果图像非常模糊,即使我所做的只是 lockFocus 和 UnlockFocus 而没有做任何其他事情。

-(NSImage*)addTarget:(NSImage*)image
{
    [image lockFocus]; // this image is sharp and clear
    [image unlockFocus];
    return image;      // this image is extremely blurry
}

任何人都知道为什么或如何解决这个问题?

谢谢粗略

4

2 回答 2

1

因此,在进行一些研究时,我意识到这与 Retina 显示器有关。我猜锁定焦点将始终绘制最好的表示,如果在计算机的任何位置连接了视网膜显示器,它将根据该比例因子进行渲染。因此,为了让它保持适当的尺寸和 DPI,我创建了一个迭代所有屏幕并返回最大 backingScaleFactor 的方法

func maximumScaleFactor(screen: NSScreen) -> CGFloat {
    var max: CGFloat = 0
    for s in NSScreen.screens()! { 
        if s.backingScaleFactor > max { max = s.backingScaleFactor } 
    }
    return max / screen.backingScaleFactor
}

然后对于'NSImage'我做了以下

-(NSImage*)addTarget:(NSImage*)image

    let scale = self.maximumScaleFactor(currentScreen)
    let originalSize = image.size

    //cut the image size in half
    var size = image.size
    size.x /= scale
    size.y /= scale


    image.lockFocus()
    //do whatever drawing you need here
    image.unlockFocus()

    //set the image back to its original size
    image.size = originalSize

    return image
}

到目前为止,这对我来说效果很好,并且图像质量在我看来主观上是一样的。

于 2016-01-18T20:01:44.007 回答
0

解决你的问题很困难,因为你没有说出你想要达到的目标。你为什么要写那个方法,为什么要调用它,你期望这个方法做什么?你说:I do is lockFocus and UnlockFocus without doing anything else.确实看起来像调用lockFocus unlockFocus(并且两者之间没有任何东西)什么都不做。但这是错误的。[image lockFocus]仅此一项就发生image了巨大的变化。一个NSImage对象包含零个、一个(在大多数情况下)或多个(图标或一些 TIFF)类对象NSImageReplockFocus在此图像上调用选择NSImageRep最适合在屏幕上描绘的 。然后它计算需要多少像素(但现在是屏幕)来渲染具有给定尺寸但分辨率仅为 72 dpi(或视网膜屏幕为 144 dpi)的图像。然后删除NSImageRep从表示列表中创建一个新的 NSImageRep。在以前的操作系统版本(10.6 之前)NSCachedImageRep中,创建了一个。但是现在NSCGImageSnapshotRep创建了一个 CGImage。做一个

NSLog(@" image is:\n%@", image );

lockFocus在调用之前和之后unlockFocus你会看到会发生什么:对于高分辨率图像,像素数会下降,这只不过是质量下降。这会使您的图像模糊。

于 2013-07-14T11:19:58.723 回答