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

时间:2014-06-10 03:43:12

标签: android image reverse-engineering true-type-fonts

使用哪种文件类型将图像嵌入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忽略了字体中的下表    忽略&#39; dcmj&#39;   在GID1中,提前宽度(2252)大于规定的最大值(2048)    不会报告后续错误。   错误的查找表:格式= 6,第一个= 65535字形中的总字形数= 894

FontForge error after opening

有点期待,因为到目前为止,TTF中的表情符号是专有编码的。事实上,我甚至使用FontForge看到黑白表情符号图像是一个巨大的成功,因为它意味着TTF在大多数情况下是标准的。 TTF不应该存储我不想的颜色信息。

他们的密钥可能是访问dcmj表中的数据或它指向的任何位置。研究FontForge我发现BMP是TTF的常见图像格式,因此我将尝试使用这些假设修改ruby script并报告回来!

更新:2014年6月18日

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

接下来我会尝试:

  1. 解析TTF查看每个&#34;字形&#34;中的数据。看看我是否能找到更多模式。我想ttf会说出图像数据的起始端。

  2. 查看htc android apk,看看他们是如何从ttf中提取和显示表情符号的。

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

    更新2014年6月20日

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

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

    Picture of Emoji in HTC messaging app

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

    然而,作为概念证明,如何提取颜色表情符号仍然很酷。 :)

    编辑:正如贾斯帕所指出的那样,HTC确实在他的回答中有一个自定义的表情符号。上面的图片来自一部未更新的手机。仍然需要弄清楚如何提取这些表情符号!!

3 个答案:

答案 0 :(得分:2)

不幸的是,我没有帐户,所以让我首先道歉,将此作为答案而不是评论发布。

您发布的显示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里程碑8的Galaxy SII(i9100)上进行测试。

答案 1 :(得分:0)

据我所知,Emojis存储在两个不同的placfes中 - 在.ttf中 - 显示在纯文本字段(例如,消息的快速预览)和图像中。也许你应该这样挖掘?

答案 2 :(得分:0)

AndroidEmoji-htc.ttf文件中的表情符号图像可能是(因为我没有要测试的字体),其格式与Google {{3}中的标准Android表情符号相同。 } + CBLC OpenType表。

您可以使用FontTools中的ttxCBDTpypi)对字体进行反汇编/重新组合以进行确认。

直接回答您的问题“格式是什么?”有两种选择:

  

未压缩的颜色位图

     

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。如果存在其他块,则行为未定义。无论PNG数据中其他块中可能存在的颜色信息如何,图像数据都应在sRGB颜色空间中。单个图像必须与位图指标中的表格具有相同的大小。