我一直在网上寻找两天多的解决方案,没有什么可用的。所有我想做的是创建一个在工作表窗口上设置的文本标签(不是用户可编辑的)(工作表窗口背景是透明的,因此,工作表的内容视图声明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 – 使用核心动画在文本上伪造子像素抗锯齿所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)