动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ ASP.NET技巧 ]的信息

本月文章推荐
.安装IE补丁后ASP.NET将无法运行.
.ASP.NET中随机数生成及应用.
.ASP.NET中使用数据处理插入数据注.
.asp.net中XML文件作为中间件进行.
.将Asp.Net页面输出为HTML.
.Web.config详解+asp.net优化.
.asp.net中在前台用js增删ListBox.
.MSBuild, NAnt, NUnit, MSTest所.
.ASP.NET 2.0发送电子邮件中存在的.
.将Web站点下的绝对路径转换为虚拟.
.ASP.NET保持用户状态的九种选择(.
.Asp.net给站点某目录增加Aspnet用.
.用gridview显示来自excel表格里的.
.三色交替的下拉列表框 .
.ASP.NET2.0自动搜索文件组成导航.
.ASP.NET: Custom AutoCompleteTe.
.全角字符转换为半角.
.值类型和引用类型在hashtable里面.
.在ASP.NET Atlas中调用Web Servi.
.我的aspx为什么无法显示中文.

编程实现QQ表情文件CFC格式

发表日期:2006-10-5 |


背景:最近闲来无事,也应论坛某会员要求,想做个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;
            fb.FaceData = File.ReadAllBytes(file);
            fb.FileLength = (uint)fb.FaceData.Length;
            fb.ThumbnailData = thumbnailData;
            fb.ThumbnailFileLength = (uint)thumbnailData.Length;
            fb.FrameLength = (uint)frameCount;

            return fb;
        }

        Helper#region Helper
        //随机方法
        internal static string RandomNum(int n) //
        {
            string strchar = "0,1,2,3,4,5,6,7,8,9";
            string[] VcArray = strchar.Split(',');
            string VNum = "";//由于字符串很短,F77pclw,c络G|?,业,e'b就不用StringBuilder了
            int temp = -1;    //记录上次随机数值,尽量避免产生几个一样的随机数
            //采用一个简单的算法以保证生成随机数的不同
            Random rand = new Random();
            for (int i = 1; i < n + 1; i++)
            {
                if (temp != -1)
                {
                    rand = new Random(i * temp * unchecked((int)

                 DateTime.Now.Ticks));
                }
                //int t =  rand.Next(35) ;
                int t = rand.Next(10);
                if (temp != -1 && temp == t)
                {
                    return RandomNum(n);
                }
                temp = t;
                VNum += VcArray[t];
            }
            return VNum;//返回生成的随机数
        }

        //从文件名获得MD5
        internal static string GetMD5(FileStream fs)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] md5byte = md5.ComputeHash(fs);
            string str = string.Empty;
            int i, j;
            foreach (byte b in md5byte)
            {
                i = Convert.ToInt32(b);
                j = i >> 4;
                str += (Convert.ToString(j, 16));
                j = ((i << 4) & 0x00ff) >> 4;
                str += (Convert.ToString(j, 16));
            }

            return str.ToUpper();
        }
        #endregion

        //从一个目录生成一个CFC文件集合
        public static void
BuildCFCFileFromDirectory(string directory)
        {
            List<byte> bytes = new List<byte>();
            foreach (string file in Directory.GetFiles(directory))
            {
                if (!IsImageFile(file))
                    continue;

                bytes.AddRange(FaceBlock.FromImage(file).ToBytes());
            }

            string fName = Path.Combine(directory, Path.GetDirectoryName(directory) + ".cfc");
            FileStream fs = File.Create(fName);
            fs.Write(bytes.ToArray(), 0, bytes.Count);
            fs.Close();
        }

        //判断是否为图像文件,方法比较简陋。
        private static bool IsImageFile(string file)
        {
            List<string> validExt = new List<string>(new string[]{
                ".bmp",
                ".jpg",
                ".jpeg",
                ".gif",
                ".png",
            });

            return validExt.Contains(Path.GetExtension(file).ToLower());
        }
    }
好,有了上面的方法,我们就可以调用了。
调用方法实在是有些简单。

FaceHelper.BuildCFCFileFromDirectory(Server.MapPath("~/img/"));
这样就OK了,现在去你的网站根目录下看看,有没有一个img.cfc的文件呢?再双击一下,是不是将img目录下的文件全部导入到QQ表情里了呢? enjoy coding!

本文原发:无垠IT教学网
http://www.cnblogs.com/skyover/archive/2006/10/03/520581.html

上一篇:web.config配置文件示例 人气:8500
下一篇:关于线程的参数、“返回值”、及线程的中止 人气:4516
浏览全部asp.net 2.0的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-4 LPLY CMS 网站管理系统 v5.0
2008-9-4 缤纷互动视频交友 v3.01.902
2008-9-4 ADN视频收藏专家 v3.0 bulid 080
2008-9-4 天空网络电影系统SKYUC v2.5.6 简
2008-9-4 Web Wiz Rich Text Editor(文本编
2008-9-4 幻影动漫网视频系统(Ppdong) v1.
2008-9-4 乐维电脑在线DIY配置系统
2008-9-4 老樊文章管理系统SQL版
2008-9-4 ASP.NET 2.53 缩略图水印组件源码
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵