紫色光传播网
关于我们 | 会员登陆 | 本站服务项目 | 收藏本站 | 留 言 薄
联系方式:QQ:276016898 电话:(0773)-2182627 (0)13507730004 EMAIL:wa#wahaha8.com
 | 服务项目 | 建站知识 | 网站首页 | 资源下载 | 访客留言 | 代理商城 | 网络编程 | 网页制作 | 视屏测试 | 
热门搜索关键字: 模板 | 错误 | 标签 | 采集 | 数据库 | 组件 | 代码 | 特效 | 木马 | 插件 | 虚拟主机
wahaha8.com baidu
栏目导航  
栏目更新推荐  
·在ASP.NET中跨页面实现多选
·asp.net身份验证和授权
·使用ASP.Net Forms模式实现WebServ
·ASP.NET 2.0页面性能的考虑
·通过数据捆绑将数据添加到ASP.NET 
·编程实现QQ表情文件CFC格式
·通过数据捆绑将数据添加到ASP.NET 
·在ASP.Net中应用Javascript
点击TOP(10)  
·在ASP.NET中跨页面实现多选
·asp.net身份验证和授权
·使用ASP.Net Forms模式实现WebServ
·ASP.NET 2.0页面性能的考虑
·通过数据捆绑将数据添加到ASP.NET 
·编程实现QQ表情文件CFC格式
·通过数据捆绑将数据添加到ASP.NET 
·在ASP.Net中应用Javascript
·轻松加密ASP.NET 2.0 Web程序配置信
·初步了解 ASP.NET AJAX 扩展
图片文章  

没有任何图片文章
 
您现在的位置: 紫色光传播 >> 网络编程 >> .net编程 >> 正文
编程实现QQ表情文件CFC格式
http://www.wahaha8.com 文章来源:www.zsgsoft.cn 点击数: 更新时间:2007-12-14 【字体:



发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口

 

背景:最近闲来无事,也应论坛某会员要求,想做个QQ表情下载的站点。本来事情是很简单的,写个小小的CRUD也就可以了,但嘻哈呵嘿既然是个.Net程序员,当然要使用.Net来实现了。今天我们就用.Net来实现CFC ( custom face cab? ) 的表情格式的打包功能。

要做到这个功能,我们必须先了解这个格式,首先Google一下。我们找到了这一篇来自清华大学的文章:FC文件格式详解

从这篇文章里我们得知了CFC的文件格式大概如下:

 

一个块有15个字段,如下

md5的字符串形式长度,4个字节
快捷键长度,4字节
表情名称长度,4字节
表情文件名长度,4字节
表情文件长度,4字节
微缩图文件名长度,4字节
微缩文件长度,4字节
表情文件帧数,4字节
图片md5的字符串形式
快捷键
表情名称
表情文件名
微缩图文件名
表情文件内容
微缩图内容
知道了格式就好办了,我们按步就班定义一个结构(struct)
 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数组。

  

我们再建一个类,命名为:FaceHelper
代码如下:
    public class FaceHelper
    {
        internal static FaceBlock GetFaceBlockFromImage(string file)
        {
            FaceBlock fb = new FaceBlock();
            //打开文件流  
            FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
            //获取图像
            Image img = Image.FromStream(fs);
            //获得一个20*20的缩略图
            Image thumbnail = img.GetThumbnailImage(20, 20, null, IntPtr.Zero);
            MemoryStream ms = new MemoryStream();
            //将缩图图转化数byte数组
            thumbnail.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            byte[] thumbnailData = ms.ToArray();
            ms.Close();
            ms.Dispose();
            thumbnail.Dispose();

            //得到一个唯一的MD5字符串
            string md5 = GetMD5(fs);
            //文件名,格式为:md5 + 扩展名
            string fileName = string.Format("{0}{1}", md5, Path.GetExtension(file));
            //缩略图文件名,格式为:md5 + fixed.bmp
            string thumbnailName = string.Format("{0}fixed.bmp", md5);
            //随机设置一个快捷键
            string uintcuts = "qq.5inet.net_" + RandomNum(6);
            fs.Close();
            fs.Dispose();

            //取得总的帧数
System.Drawing.Imaging.FrameDimension fd = System.Drawing.Imaging.FrameDimension.Resolution;
            int frameCount = img.FrameDimensionsList.Length;
            img.Dispose();

            fb.MD5 = md5;
            fb.MD5Length = (uint)md5.Length;
            fb.uintcuts = uintcuts;
            fb.uintcutLength = (uint)uintcuts.Length;
            fb.FaceName = uintcuts;
            fb.FaceNameLength = (uint)uintcuts.Length;
            fb.FaceFileName = fileName;
            fb.FaceFileNameLength = (uint)fileName.Length;
            fb.ThumbnailFileName = thumbnailName;
            fb.ThumbnailFileNameLength = (uint)thumbnailName.Length;
  &n

[1] [2] 下一页

| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明
Copyright 2006-2008 Wahaha8.com, all rights reserved. Designed by wahaha8.com
桂ICP备05011060号