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 文件中播放位于硬盘中的文件路径中的视频吗?
背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理
查找不在当前目录中的文件的路径并逐个访问该文件夹中的文件 - Python