NSImage lockFocus unlockFocus图像bomes模糊

时间:2013-07-14 02:49:09

标签: macos graphics

我从磁盘加载一个图像(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
}

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

感谢 粗

2 个答案:

答案 0 :(得分: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
}

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

答案 1 :(得分:0)

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

NSLog(@" image is:\n%@", image );
lockFocus之前的

unlockFocus的调用之后的

,您将看到会发生什么:对于高分辨率图像,像素数将会减少,这只不过是减少了质量。这会使你的图像变得模糊。