我从磁盘加载一个图像(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
}
有人知道为什么或如何解决这个问题?
感谢 粗
答案 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]
会显着改变image
。 NSImage
对象包含类NSImageRep
的零,一(大多数情况)或更多(图标或某些TIFF)对象。在此图片上调用lockFocus
会选择NSImageRep
,这最适合在屏幕上进行描绘。然后它计算需要渲染具有给定大小但分辨率仅为72 dpi(或视网膜屏幕为144 dpi)的图像的像素(但现在用于屏幕)。然后从表示列表中删除NSImageRep
,然后创建一个新的NSImageRep。在以前的操作系统版本(10.6之前)中,创建了NSCachedImageRep
。但是现在创建了一个NSCGImageSnapshotRep
,它是一个CGImage。做一个
NSLog(@" image is:\n%@", image );
lockFocus
之前的和unlockFocus
的调用之后的
,您将看到会发生什么:对于高分辨率图像,像素数将会减少,这只不过是减少了质量。这会使你的图像变得模糊。