背景:最近闲来无事,也应论坛某会员要求,想做个QQ表情下载的站点。本来事情是很简单的,写个小小的CRUD也就可以了,但嘻哈呵嘿既然是个.Net程序员,当然要使用.Net来实现了。今天我们就用.Net来实现CFC ( custom face cab? ) 的表情格式的打包功能。
要做到这个功能,我们必须先了解这个格式,首先Google一下。我们找到了这一篇来自清华大学的文章:FC文件格式详解
从这篇文章里我们得知了CFC的文件格式大概如下:
一个块有15个字段,如下
- md5的字符串形式长度,4个字节
- 快捷键长度,4字节
- 表情名称长度,4字节
- 表情文件名长度,4字节
- 表情文件长度,4字节
- 微缩图文件名长度,4字节
- 微缩文件长度,4字节
- 表情文件帧数,4字节
- 图片md5的字符串形式
- 快捷键
- 表情名称
- 表情文件名
- 微缩图文件名
- 表情文件内容
- 微缩图内容
1
Struct
#region Struct
2
public struct FaceBlock
3
{
4
public uint MD5Length; //32
5
public uint uintcutLength; //4
6
public uint FaceNameLength; //4
7
public uint FaceFileNameLength; //36 md5 + extension
8
public uint FileLength;
9
public uint ThumbnailFileNameLength; //41 md5 + fixed.bmp
10
public uint ThumbnailFileLength;
11
public uint FrameLength;
12
public string MD5;
13
public string uintcuts;
14
public string FaceName;
15
public string FaceFileName;
16
public string ThumbnailFileName;
17
public byte[] FaceData;
18
public byte[] ThumbnailData;
19
20
public static FaceBlock FromImage(string file)
21
{
22
return FaceHelper.GetFaceBlockFromImage(file);
23
}
24
25
byte[] GetBytes(uint value)
26
{
27
byte[] bt = BitConverter.GetBytes(value);
28
List<byte> bytes = new List<byte>();
29
bytes.AddRange(bt);
30
if (bytes.Count < 4)
31
{
32
int l = 4 - bytes.Count;
33
for (int i = 0; i < l; i++)
34
bytes.Add((byte)0);
35
}
36
return bytes.ToArray();
37
}
38
39
public byte[] ToBytes()
40
{
41
List<byte> bytes = new List<byte>();
42
Encoding e = Encoding.ASCII;
43
bytes.AddRange(GetBytes(MD5Length));
44
bytes.AddRange(GetBytes(uintcutLength));
45
bytes.AddRange(GetBytes(FaceNameLength));
46
bytes.AddRange(GetBytes(FaceFileNameLength));
47
bytes.AddRange(GetBytes(FileLength));
48
bytes.AddRange(GetBytes(ThumbnailFileNameLength));
49
bytes.AddRange(GetBytes(ThumbnailFileLength));
50
bytes.AddRange(GetBytes(FrameLength));
51
52
bytes.AddRange(e.GetBytes(MD5));
53
bytes.AddRange(e.GetBytes(uintcuts));
54
bytes.AddRange(e.GetBytes(FaceName));
55
bytes.AddRange(e.GetBytes(FaceFileName));
56
bytes.AddRange(e.GetBytes(ThumbnailFileName));
57
58
bytes.AddRange(FaceData);
59
bytes.AddRange(ThumbnailData);
60
61
return bytes.ToArray();
62
}
63
}
64
#endregion
其中含有两方法,一个是从文件得到一个此结构的静态方法,另一个是将此结构转化为byte数组。


2

3



4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21



22

23

24

25

26



27

28

29

30

31



32

33

34

35

36

37

38

39

40



41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

我们再建一个类,命名为:FaceHelper
代码如下:


































































































































































好,有了上面的方法,我们就可以调用了。
调用方法实在是有些简单。

这样就OK了,现在去你的网站根目录下看看,有没有一个img.cfc的文件呢?再双击一下,是不是将img目录下的文件全部导入到QQ表情里了呢? enjoy coding!
本文原发: 无垠IT教学网
如有不妥,请各位光临 论坛指教。