使用扩展/ UIgraphicscontext

时间:2016-10-17 15:48:56

标签: ios swift emoji uigraphicscontext

因此众所周知,苹果的unicode支持Emoji的图像可以以高达160x160像素的分辨率提取。有一个工具可以通过在这里从“apple color emoji”字体中提取数据来在OS X上执行此操作:https://github.com/tmm1/emoji-extractor

我有兴趣在iOS上以类似的方式提取/利用Apple的Emoji图像,我找到了以下解决方案,并且非常喜欢这里的实现:https://stackoverflow.com/a/38809531/4556704

extension String {
func image() -> UIImage {
    let size = CGSize(width: 30, height: 35)
    UIGraphicsBeginImageContextWithOptions(size, false, 0);
    UIColor.whiteColor().set()
    let rect = CGRect(origin: CGPointZero, size: size)
    UIRectFill(CGRect(origin: CGPointZero, size: size))
    (self as NSString).drawInRect(rect, withAttributes: [NSFontAttributeName: UIFont.systemFontOfSize(30)])
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

}

然而,我遇到了一个问题,即我遇到了这个实现。如果我使用上面的字符串扩展名,我很明显结果图像的分辨率不是160x160像素。我的意思是,我无法生成质量相当的图像,比如说,如果我要在项目资产中加入160x160图像。

这是什么原因,如果不向我的项目导入超过1700个表情符号图像,我可以解决这个问题吗?我认为iOS上的字体仍然必须包含生成160x160图像样本所需的数据。 String扩展是理想的,因为它允许我比我简单地导入所有这些图像更自由地引用表情符号字符。

我认为这可能需要一些低级代码,这可能比它的价值更麻烦,但我真的很想知道更多关于这个问题的根源和可能的修复。我确信这归因于苹果没有将表情符号渲染到高于必要水平的水平,但肯定有一些方法可以覆盖它。另外我知道还有其他高分辨率的表情符号图像集,这个问题与此无关。

编辑: mismatched resolutions

编辑10/18/16: 我得出的结论是,问题可归因于被采样的源图像不具有可能的最高分辨率。似乎表情符号没有以高于48x48像素的分辨率进行渲染,因为已经证明表情符号图像可以在OS X上渲染到160x160像素,并且可以从“Apple Color Emoji.ttf / .ttc”中删除“在160x160像素。我不确定是否有可能解决这个问题,因为它似乎是iOS使用unicode字符代码映射到png图像数据的强制限制。

2 个答案:

答案 0 :(得分:1)

您的问题是您获取特定字体大小的字符串,然后将其强制插入另一个特定大小的区域。两者可能不匹配,导致绘制的图像缩放以适合。

计算给定字符串和字体所需的大小,或计算所需的字体大小以允许给定的字符串适合分配的大小。

答案 1 :(得分:1)

替换

UIGraphicsBeginImageContext(rect.size)

UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)

UIGraphicsBeginImageContextWithOptions(rect.size, false, 3.0)

2.0的比例也有效;我很快就看不到它和3.0之间的区别。