您现在的位置: 网页制作教程网 >> 网络编程 >> Asp.net 教程 >> ASP.NET 开发技巧 >> 文章正文

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

作者:动态网站…

来源:动态网站制作指南

热度:

2006-10-7 17:50:14

我们再建一个类,命名为: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

上一页  [1] [2] 

我来说两句:

1分 2分 3分 4分 5分
姓名: *


* 请各位网友遵纪守法并注意语言文明。
网站简介 | 联系方式 | 意见建议 | 版权说明
Copyright © 2007 All rights reserved
滇ICP备06006992号