背景: 最近やることがないので、フォーラムのメンバーからのリクエストで、QQ 絵文字をダウンロードするためのサイトを作成したいと思いました。元々は小さな CRUD を書くだけの非常に単純なものでしたが、はははは .Net プログラマなので、当然のことながら .Net を使用して実装する必要があります。今日は.Netを使ってCFC(カスタムフェイスキャブ?)表現形式のパッケージ化機能を実装してみます。
この機能を実現するには、まずこの形式を理解し、まず Google で検索する必要があります。清華大学の記事「FC ファイル形式の詳細な説明」を見つけました。
この記事から、CFC ファイル形式は次のとおりであることがわかりました。
ブロックには次の 15 フィールドがあります:
md5 文字列の長さ、4 バイトのショートカット キーの長さ、4 バイトの絵文字名の長さ、4 バイトの絵文字ファイル名の長さ、4 バイトの絵文字ファイルの長さ、4 バイトのサムネイル ファイル名の長さ、 4バイトのミニチュアファイル長、4バイトの顔文字ファイルのフレーム番号、4バイトの画像 md5文字列形式 ショートカットキー 顔文字名 顔文字ファイル名 サムネイルファイル名 顔文字ファイルの内容 サムネイルの内容 形式さえわかればOK 構造体(struct)を定義しましょう一歩ずつ
1 構造体#region 構造体
2 パブリック構造体 FaceBlock
3 {
4 パブリック uint MD5Length;
5 public uint uintcutLength;
6 public uint FaceNameLength;
7 public uint FaceFileNameLength //36 md5 + 拡張子;
8 public uint FileLength;
9 public uint ThumbnailFileNameLength; //41 md5 + fix.bmp;
10 public uint ThumbnailFileLength;
11 public uint FrameLength;
12 パブリック文字列 MD5。
13 個のパブリック文字列 uintcut。
14 パブリック文字列 FaceName;
15 パブリック文字列 FaceFileName;
16 パブリック文字列サムネイルファイル名。
17 public byte[] FaceData;
18 public byte[] サムネイルデータ;
19
20 public static FaceBlock FromImage(文字列ファイル)
21 {
22 return FaceHelper.GetFaceBlockFromImage(file);
23 }
24
25 byte[] GetBytes(uint 値)
26 {
27 byte[] bt = BitConverter.GetBytes(値);
28 List
29 バイト.AddRange(bt);
30 if (bytes.Count < 4)
31 {
32 int l = 4 - バイト数。
33 for (int i = 0; i < l; i++)
34 バイト.Add((バイト)0);
35}
36 バイトを返します。ToArray();
37 }
38
39 パブリックバイト[]ToBytes()
40 {
41 List
42 エンコーディング e = エンコーディング.ASCII;
43 バイト.AddRange(GetBytes(MD5Length));
44 バイト.AddRange(GetBytes(uintcutLength));
45 バイト.AddRange(GetBytes(FaceNameLength));
46 バイト.AddRange(GetBytes(FaceFileNameLength));
47 バイト.AddRange(GetBytes(FileLength));
48 バイト.AddRange(GetBytes(ThumbnailFileNameLength));
49 バイト.AddRange(GetBytes(ThumbnailFileLength));
50 バイト.AddRange(GetBytes(FrameLength));
51
52 バイト.AddRange(e.GetBytes(MD5));
53 バイト.AddRange(e.GetBytes(uintcuts));
54 bytes.AddRange(e.GetBytes(FaceName));
55 バイト.AddRange(e.GetBytes(FaceFileName));
56 bytes.AddRange(e.GetBytes(ThumbnailFileName));
57
58 バイト.AddRange(FaceData);
59 バイト.AddRange(ThumbnailData);
60
61 バイトを返します。ToArray();
62 }
63}
64 #endregion には 2 つのメソッドが含まれています。1 つはファイルからこの構造を取得する静的メソッドで、もう 1 つはこの構造をバイト配列に変換するメソッドです。
別のクラスを作成して、「FaceHelper」という名前を付けましょう。
コードは次のとおりです。
パブリック クラス FaceHelper
{
内部静的 FaceBlock GetFaceBlockFromImage(文字列ファイル)
{
FaceBlock fb = 新しい FaceBlock();
// ファイルストリームを開く
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
//画像を取得する
画像 img = Image.FromStream(fs);
// 20*20 のサムネイルを取得します
画像サムネイル = img.GetThumbnailImage(20, 20, null, IntPtr.Zero);
MemoryStream ms = new MemoryStream();
//サムネイル画像をバイト配列に変換します
sumnail.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] サムネイルデータ = ms.ToArray();
ms.Close();
ms.Dispose();
sumnail.Dispose();
//一意の MD5 文字列を取得します。
文字列 md5 = GetMD5(fs);
//ファイル名、形式は: md5 + 拡張子
string fileName = string.Format("{0}{1}", md5, Path.GetExtension(file));
//サムネイルファイル名、形式: md5 + fixed.bmp
string sumnailName = string.Format("{0}fixed.bmp", md5);
//ランダムなショートカットキーを設定する
文字列 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 = ファイル名;
fb.FaceFileNameLength = (uint)fileName.Length;
fb.サムネイルファイル名 = サムネイル名;
fb.ThumbnailFileNameLength = (uint)thumbnailName.Length;
fb.FaceData = File.ReadAllBytes(ファイル);
fb.FileLength = (uint)fb.FaceData.Length;
fb.ThumbnailData = サムネイルデータ;
fb.ThumbnailFileLength = (uint)thumbnailData.Length;
fb.FrameLength = (uint)frameCount を
返します。
ヘルパー
#region ヘルパー
//ランダムメソッド
内部静的文字列 RandomNum(int n) //
{
文字列 strchar = "0,1,2,3,4,5,6,7,8,9";
string[] VcArray = strchar.Split(',');
string VNum = "";//文字列が非常に短いため、F77pclw,cnetworkG|?,ye,e'b は StringBuilder を必要としません。
int temp = -1; //最後の乱数値を記録し、複数の同一の乱数を生成しないようにします。
//単純なアルゴリズムを使用して、生成された乱数の違いを確認します
ランダム ランド = new Random();
for (int i = 1; i < n + 1; i++)
{
if (温度 != -1)
{
rand = new Random(i * temp * unchecked((int)
DateTime.Now.Ticks));
}
//int t = rand.Next(35);
int t = rand.Next(10);
if (温度 != -1 && 温度 == t)
{
RandomNum(n) を返します。
}
温度 = t;
VNum += VcArray[t];
}
return VNum;//生成された乱数を返す
}
//ファイル名からMD5を取得
内部静的文字列 GetMD5(FileStream fs)
{
MD5CryptoServiceProvider md5 = 新しい MD5CryptoServiceProvider();
byte[] md5byte = md5.ComputeHash(fs);
文字列 str = 文字列.Empty;
int i, j;
foreach (md5byte のバイト b)
{
i = Convert.ToInt32(b);
j = i >> 4;
str += (Convert.ToString(j, 16));
j = ((i << 4) & 0x00ff) >> 4;
str += (Convert.ToString(j, 16));
str.ToUpper()を返します
。
}
#endregion
//ディレクトリから CFC ファイル コレクションを生成します
パブリック静的空隙
BuildCFCFileFromDirectory(文字列ディレクトリ)
{
List
foreach (Directory.GetFiles(directory) 内の文字列ファイル)
{
if (!IsImageFile(ファイル))
続行;
bytes.AddRange(FaceBlock.FromImage(file).ToBytes());
string
fName = Path.Combine(ディレクトリ, Path.GetDirectoryName(ディレクトリ) + ".cfc");
FileStream fs = File.Create(fName);
fs.Write(bytes.ToArray(), 0, bytes.Count);
fs.Close();
}
//画像ファイルかどうかを判断する方法は比較的簡単です。
private static bool IsImageFile(文字列ファイル)
{
List
".bmp"、
".jpg"、
".jpeg"、
".gif"、
".png"、
});
戻り値 validExt.Contains(Path.GetExtension(file).ToLower());
}
}
さて、上記のメソッドを使用すると、それを呼び出すことができます。
メソッドの呼び出しは非常に簡単です。
FaceHelper.BuildCFCFileFromDirectory(Server.MapPath("~/img/"));
それでは、Web サイトのルート ディレクトリに移動して、img.cfc ファイルがあるかどうかを確認してください。もう一度ダブルクリックして、img ディレクトリ内のすべてのファイルを QQ 絵文字にインポートしましたか?
この記事は元: Wuyuan IT Teaching Network によって発行されました
。
http://www.cnblogs.com/skyover/archive/2006/10/03/520581.html