AndroidEmoji-htc.ttf 文件中的表情符号图像是如何编码的?

Posted

技术标签:

【中文标题】AndroidEmoji-htc.ttf 文件中的表情符号图像是如何编码的?【英文标题】:How are the emoji images encoded in AndroidEmoji-htc.ttf file? 【发布时间】:2014-07-30 17:07:10 【问题描述】:

使用什么文件类型将图像嵌入androidEmoji-htc.ttf?直接下载:AndroidEmoji-htc.ttf

可以轻松地从AppleColorEmoji.ttf 中提取图像,因为可以使用十六进制编辑器找到PNG headers。这个ruby script 可以提取它们。算法是described here。

十六进制编辑器中的文件示例:

0706 2627 2626 2726 2627 2626 2727 2727  ..&'&&'&&'&&''''
2726 2627 2626 2726 2627 2636 3736 3637  '&&'&&'&&'&67667
3636 3736 3637 3737 3737 3636 3736 3637  6676677777667667
3636 0131 3636 3736 3635 3527 2626 3132  66.16676655'&&12
2627 2626 2726 2627 2721 2115 1533 3232  &'&&'&&''!!..322
1716 1617 1634 1110 0607 0606 0706 0623  .....4.........#
2315 1533 3335 3523 2226 2726 2627 3434  #..3355#"&'&&'44
3535 3332 3233 1616 1716 1617 1616 1716  553223..........
1617 1616 1716 1617 1616 1716 3237 3236  ............2726
3737 3736 3637 3636 3737 2323 0706 0607  7776676677##....
0606 0706 0627 2226 2726 2627 2626 2726  .....'"&'&&'&&'&
2627 2626 3130 2627 2626 2726 2627 2626  &'&&10&'&&'&&'&&
2727 3535 3736 3637 3636 0131 3232 3332  ''55766766.12232
1617 1616 1716 3017 1616 1516 0607 0606  ......0.........
0706 0607 0606 2323 3534 3437 3636 3736  ......##54476676
3608 bf05 020b 1c2a 0d09 0b0d 66a4 b72c  6......*....f..,
0202 0233 8a8d 9c9c 8d88 3302 0202 022a  ...3......3....*
9a8d 631a 3c05 090b 3e1a 1a3e 0b09 0b0d  ..c.<...>..>....
65a5 b918 1616 1d67 6572 4028 2a0f 251f  e......ger@(*.%.
7365 691b 1814 1a98 8d65 183b 0409 0d2c  sei......e.;...,
1a0b 0702 fb8b 1e1d 423e 3f44 2a0d 3a3f  ........B>?D*.:?
034f 4f42 4435 3203 1e1b 040d 140d 0704  .OOBD52.........
0303 040d 1b0d 041b 1e03 3235 4442 4f4f  ..........25DBOO
033f 3a0d 2a55 5265 1f21 3d40 4044 2a0d  .?:.*URe.!=@@D*.
3940 024d 4f44 4235 3502 1d1c 050d 1a0d  9@.MODB55.......
0502 0207 040d 140d 051c 1d02 3535 4244  ............55BD
4f4d 0240 390d 2a56 5301 c806 0d0b 2611  OM.@9.*VS.....&.
0b06 0503 120b 122e 1835 0837 33fe d9fe  .........5.73...
dc2e 2c02 0b12 0407 0b02 0306 071a 1006  ..,.............
2a23 f8fb 2a30 070f 1d0d 022a 1818 0914  *#..*0.....*....

2014 年 6 月 18 日更新: 在@naXa 的建议下,在FontForge 版本20120731-ML(当前最新版本)中打开文件会出现此错误:

字体中的下表已被 FontForge 忽略 忽略“dcmj” 在 GID1 中,前进宽度 (2252) 大于规定的最大值 (2048) 不会报告后续错误。 错误的查找表:format=6, first=65535 字形总字形=894

有些意料之中,因为迄今为止 TTF 中的表情符号是专有编码的。我什至使用 FontForge 看到黑白表情符号图像这一事实是一个巨大的成功,因为这意味着 TTF 在大多数情况下是标准的。 TTF 不应该存储我不认为的颜色信息。

他们的关键可能是访问 dcmj 表中的数据或它指向的任何地方。研究 FontForge 我发现 BMP 是 TTF 的常见图像格式,所以我将尝试使用这些假设修改 ruby script 并报告!

更新:2014 年 6 月 18 日

我发现似乎是 BMP 标头 source1 source2,使用十六进制编辑器以 424D 开头,但标头似乎无效。

接下来我会尝试:

    解析 TTF 查看每个“字形”中的数据,看看是否能找到更多模式。我想ttf会说图像数据的开始结束。

    查看 htc android apk 以了解他们如何从 ttf 中提取和显示表情符号。

我现在已经没有时间了,如果有人有任何其他建议我很感兴趣。

2014 年 6 月 20 日更新

使用@naXa 的建议双击字形并导出为任何格式都会给我任何大小的非彩色图标,但仍然不会显示我正在寻找的彩色位图表情符号。

我最后去商店看了一部 HTC 手机,令我惊讶的是,他们正在使用通过消息应用程序看到的 Apple 表情符号字体:

我几乎可以肯定这些图像存储在上面提供的 HTC 字体中,但这个结论使得提取这些图像的效果远不理想。

但是,作为概念证明,知道如何提取彩色表情符号仍然很酷。 :)

编辑:正如 Jasper 指出的那样,HTC 实际上确实在他的答案中设置了一个自定义表情符号。上图来自未更新的手机。还需要弄清楚如何提取这些表情符号!!

【问题讨论】:

首先您需要了解法律方面:字形是受版权保护的东西 - 您不能简单地选择任何字体并撕掉其字形。关于您的问题:您是否尝试过FontForge?它可以打开 ttf,将字形导出为 svg,然后使用任何图像转换器即可获得所需格式的图像(例如,查看this image to png converter) 我已经用关于FontForge 的调查结果编辑了这个问题。谢谢 我无法使用 @naXa 使用 FontForge 提取图像。任何其他有用的建议将不胜感激。 您是否尝试过双击任何字形并将其导出为 svg? 你说得对,TTF 不支持颜色字形,但是无论如何制造商已经将它们嵌入到 TTF 中。如果您阅读了我的问题,我已多次说明... 【参考方案1】:

很遗憾,我没有帐户,所以让我首先为将其发布为答案而不是评论而道歉。

您发布的显示 Apple Color Emojis 的图片似乎来自运行旧版本 Sense/Android 的手机,而您引用的文件几乎肯定来自 Sense 5-6/Android 4.3-4.4 如果您查看您能够从文件中提取的灰度表情符号,您会注意到它们实际上与您提供的图片不匹配。但是,它们确实符合以下条件:http://assets.hardwarezone.com/img/2013/10/HTC_One_Max_Emoticons_Keyboard_jpg.jpg

这使我得出结论,完全有可能没有存储在 TTF 中的传统位图,而是使用某种专有格式为每个表情符号的不同部分分配颜色。

编辑:尝试直接将文件复制到我的手机以查看会发生什么(尝试替换 NotoColorFont.ttf 以及直接复制并在 fallback_fonts.xml 中引用它,似乎没有任何区别) .截图在这里:http://imgur.com/OGyq6T2

如您所见,它们没有颜色显示,但我们已经知道默认的 Android 表情符号和 Apple Color Emoji 在 Android 设备上都可以正常显示,这意味着 HTC 不遵循 Android 和 ios 使用的任何标准.

在运行 CyanogenMod 11 Milestone 8 的 Galaxy SII (i9100) 上测试。

【讨论】:

谢谢,好信息。最终会发现它们是如何编码的。逆向工程 HTC 设备(apk?)如何读取 TTF 并显示它们可能是一个选项。【参考方案2】:

AndroidEmoji-htc.ttf 文件中的表情符号图像可能(因为我没有要测试的字体)以与 Google 的 CBLC+@ 中的标准 Android 表情符号相同的格式存储987654322@ OpenType 表。

您可以使用 FontTools 中的ttx (pypi, github) 来拆解/重新组装字体。

直接回答您的问题“格式是什么?”是两个选项:

未压缩的彩色位图

在 CBLC 表中定义的 bitmapSizeTable 结构的 bitDepth 字段的值“32”,用于标识每个像素具有 8 位蓝色/绿色/红色/alpha 通道的颜色位图,按每个像素的顺序编码(参考从这里开始作为 BGRA)。颜色通道表示预乘颜色,是 sRGB 颜色空间中的编码颜色。例如,颜色“半透明的全绿色”被编码为 \x00\x80\x00\x80,而不是 \x00\xFF\x00\x80。

EBDT / EBLC 表中定义的所有 imageFormat 值均适用于 CBDT / CBLC 表。

压缩颜色位图

每个单独字形的图像都存储为纯 PNG 数据。此类 PNG 数据中仅允许使用以下块:IHDR、PLTE、tRNS、sRGB、IDAT 和 IEND。如果存在其他块,则行为未定义。图像数据应位于 sRGB 颜色空间中,而不管 PNG 数据的其他块中可能存在的颜色信息。各个图像的大小必须与位图指标中的表格预期的大小相同。

【讨论】:

【参考方案3】:

据我所知,表情符号存储在两个不同的位置 - 在 .ttf 中 - 以显示在纯文本字段(例如,消息的快速预览)和图像中。也许您应该深入研究一下?

【讨论】:

在 OSX/iOS 设备上,它们在文本字段中显示彩色表情符号。 Apple 曾经将它们存储在图像中,但在 iOS5 中将它们移动到 ttf。有时图像单独存储在设备上,例如目前在三星设备上,但不是完整的。我找到的全套彩色emoji一直在ttfs中。 这是xda-developers 上的 HTC 用户,他在 HTC 设备上找不到图像。就像 LG 一样,我认为这些表情符号仅在 TTF 中。 据我所知,TTF 无法存储多色图像……还是我错了? 您可以将彩色图像放入 TTF,就像您也可以放入声音剪辑一样。这是可能的,但把它们弄出来是一个技巧,因为它不是标准的,所以没有工具可以做到这一点。谷歌和苹果一直在将彩色图像放入 TTF 以显示表情符号,但他们也编写了工具以确保它们正确显示。所以,你是对的,没有遵循 TTF 标准的 TTF 编辑程序能够使用这些。 是的,你是对的。 ruby 中有一个实用程序:github.com/tmm1/emoji-extractor 也许你可以深入研究一下?【参考方案4】:

没有看过 Android 表情符号,但我设法提取了 iOS 表情符号 通过千斤顶一些工具来做到这一点,因为网络上没有任何东西似乎可以 100% 做到这一点。 十六进制编辑器是我使用的所有关键...

iOS 5.0 使用 uint8 类型的 RGBA 数据存储为元组

iOS 5.1 更改为 pngs,这些是连续编写的

iOS 6 结合了 iOS 5.0 和 5.1 格式。第 1 组和第 2 组是 uint8 类型数据,第 3 组(ipad @ 96x96px)是 Apple 采用的优化 png 格式,例如将 RGBA 切换为 BGRA ......显然是字节传输......

iOS 7 与 iOS 8 到 8.2 保持一致。

希望对您有所帮助...

【讨论】:

以上是关于AndroidEmoji-htc.ttf 文件中的表情符号图像是如何编码的?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 apatch 中的 php 文件中播放位于硬盘中的文件路径中的视频吗?

将一个文件中的标头值匹配到 R 中的文件列表

背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理

查找不在当前目录中的文件的路径并逐个访问该文件夹中的文件 - Python

我们如何使用文件系统中的某些动态字段搜索存储在 zip 文件中的 xml 文件?

读取文件夹中的所有文件以及python中的文件名? [复制]