NSImage总是被缩放并且看起来很糟糕

时间:2014-04-09 23:16:17

标签: macos cocoa scale nsimage nsimageview

我想创建NSScrollView对象的NSImage,因此我可以将平面图形用于动画目的。

当我将我的scrollview对象渲染成图形并将其添加回我的窗口时,它可以工作,但看起来非常糟糕,因为它被缩放到99%或者其他东西。我希望图像不缩放,100%像素准确。 (注意:图像不是缩放,它是相同的大小,它只是看起来就像它重新调整一样 - 与屏幕上的视图相比,文本看起来粗糙和差滚动视图)

我的代码: (scrollView是我的NSScrollView对象)

NSData *pdf = [scrollView dataWithPDFInsideRect:[scrollView bounds]];
NSImage *image = [[NSImage alloc] initWithData:pdf];

NSImageView *imageView = [[NSImageView alloc] initWithFrame:[scrollView bounds]];
[imageView setImage: image];
[mainGUIPanel addSubview: imageView];

我尝试了一堆东西,用像素大小,边界混淆,使用IB创建目标NSView并将图像放在其中但却无法使图像看起来不坏。有什么想法吗?

编辑: 我尝试将pdf数据写入pdf文件并进行查看,看起来没问题。因此,位图图像正在被捕获,只是在显示器上看起来它有点缩放。

EDIT2: 还尝试获取这样的位图:

NSBitmapImageRep *bitmap = [scrollView bitmapImageRepForCachingDisplayInRect:[scrollView bounds]];
[scrollView cacheDisplayInRect:[scrollView bounds] toBitmapImageRep:bitmap];

NSImage * image = [[NSImage alloc] initWithSize:[bitmap size]];
[image addRepresentation: bitmap];

相同的结果 - 位图在显示时看起来完全相同,不好并且缩放。

这让我相信捕获位图数据无论哪种方式都能正常工作,它会创建视图并渲染正在进行缩放的图像。如何确保视图和图像以正确的大小和缩放显示?

EDIT3: 好的,我开始了一个新的空白项目并进行了设置,它完美运行 - 新的imageview与抓取的位图相同。所以我怀疑在将位图绘制到视图时,我的问题源于一些渲染/合成问题。进一步调查......

事实证明问题源于我正在渲染的scrollView。这有一个透明的背景(在IB中关闭Draw Background),文本是scrollView看起来不错。如果我使用透明背景颜色打开“绘制背景”,则文本呈现得非常糟糕,就像我以编程方式捕获图像时一样。

因此,在我的应用程序中,即使关闭“绘制背景”,也会捕获scrollView图像,就像启用“绘制背景”一样。所以我需要理解为什么当Draw Background打开并且设置为透明时文本会被严重渲染,希望这会引导我找到解决方案。

还尝试创建一个关闭背景绘图的NSClipview并将位图视图放入其中,但它的渲染方式相同。我无法找到一种方法将透明图像渲染到屏幕上而没有可怕的伪影。

1 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案。我没有获取透明背景scrollview对象本身,而是获取父视图(主要是窗口背景),并将边界限制为scrollview对象的大小。

它可以捕获滚动视图的背景和内容,并且可以正确显示而不会出现任何透明问题。