objective-c – 使用核心动画在文本上伪造子像素抗锯齿

objective-c – 使用核心动画在文本上伪造子像素抗锯齿,第1张

概述对于使用Core Animation layer支持的视图进行项目工作的人来说,不幸的是,对于未在预设的不透明背景上呈现的文本,子像素抗锯齿(文本平滑)被禁用。现在,对于能够为其文本设置不透明背景(使用setBackgroundColor:调用或Interface Builder中的等效设置)的人,此问题不会出现太多的问题。对于其他人,虽然,谁绝对没有办法解决它,这不是一个人不能忽视的。 我一直在 对于使用Core Animation layer支持的视图进行项目工作的人来说,不幸的是,对于未在预设的不透明背景上呈现的文本,子像素抗锯齿(文本平滑)被禁用。现在,对于能够为其文本设置不透明背景(使用setBackgroundcolor:调用或Interface Builder中的等效设置)的人,此问题不会出现太多的问题。对于其他人,虽然,谁绝对没有办法解决它,这不是一个人不能忽视的。

我一直在网上寻找两天多的解决方案,没有什么可用的。所有我想做的是创建一个在工作表窗口上设置的文本标签(不是用户可编辑的)(工作表窗口背景是透明的,因此,工作表的内容视图声明wantsLayer为true会禁用窗口上所有标签的文本平滑) ;东西很简单。我见过很多有争议的解决方案(快速的Google搜索会在很多其他地方提出这个话题),但到目前为止,所有这些解决方案都依赖于人们能够并愿意妥协不透明的背景(你不能在纸张上使用)。

到目前为止,我可以想象的最佳方向是将文本预渲染为文本平滑到图像上,然后像平常一样在层支持的视图上显示图像。然而,这似乎是不可能的。我认为人们会尝试的“正常”方式是:

NSAttributedString *string = [[self cell] attributedStringValue];NSImage *textimage = [[NSImage alloc] initWithSize:[string size]];[textimage lockFocus];[string drawAtPoint:NSZeroPoint];[textimage unlockFocus];

但是这似乎不工作(很可能是因为当从drawRect:调用时,图形上下文设置已禁用文本平滑 – 子像素抗锯齿已关闭,并使用常规抗锯齿),但是更多的参与解决方案发现在this question(在那里你创建自己的图形上下文)。

那么如何做这样的事情可能?你能以某种方式“假的”文本平滑的效果吗?有没有甚至黑客的解决方法,将得到一些设置?我真的不想放弃核心动画只是因为这个愚蠢的问题;有很多好处,它节省了大量的时间和代码。

编辑:经过大量的搜索,我发现了一些东西。虽然thread itself只是重申我的怀疑,我想我可能找到了一个解决方案的问题:自定义CALayer绘图。 Timothy Wood在他的一个回答中附加了一个示例项目,该项目使用几种技术显示字体平滑,其中几项工作。我将研究将其集成到我的项目中。

编辑#2:结果,上面的链接也是一个胸围。虽然链接的方法给出了子像素抗锯齿,但是它们在透明背景上也失败。

解决方法 如果您使用透明图纸,您不会预先知道它下面的像素。他们可能会改变。请记住,对于所有三种颜色,您都有一个Alpha通道:如果使其透明,则不会看到任何子像素效果,但如果使其不透明,则所有三个子元素都将与背景进行合成。如果您给边缘合适的颜色在白色背景上,如果背景更改为某种其他颜色,它将不会看起来正确。

例如,假设您在白色背景上绘制黑色文本,子元素顺序为RGB。右边缘可以是微弱的蓝色:高B值(远离字形的一侧上的全亮度),略低但仍然高的R和G值(在接近字形的一侧上具有较低的亮度)。如果你现在复合该像素在深灰色的背景,你会使它比如果你已经直接渲染黑色文本在深灰色的背景上更轻。

基本上,你没有面临CoreAnimation的任意限制:在可以在任意背景上合成的透明层上使用子像素渲染没有任何意义。你需要一个单独的Alpha颜色通道,但由于你的缓冲区的像素格式是RGBA(或ARGB或任何它是),你不能有它。

但这导致我们的解决方案。如果您知道背景将保持不变(例如,工作表显示在您控制其内容的窗口上),那么您可以简单地让图层不透明,用背景窗口的覆盖区域的副本来填充它,然后渲染子像素抗锯齿文本。基本上,你会预先合成你的图层与背景。如果背景保持不变,这将看起来与正常的Alpha合成将做的相同,除了现在你可以做子像素文本呈现;如果背景变化,那么你就不得不放弃做子像素文本呈现(虽然我想你可以继续复制背景和重绘不透明覆盖每当它改变)。

总结

以上是内存溢出为你收集整理的objective-c – 使用核心动画在文本上伪造子像素抗锯齿全部内容,希望文章能够帮你解决objective-c – 使用核心动画在文本上伪造子像素抗锯齿所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1044314.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存