Latar Belakang: Saya tidak melakukan apa pun akhir-akhir ini, dan atas permintaan anggota forum, saya ingin membuat situs untuk mengunduh emotikon QQ. Awalnya sangat sederhana, cukup tulis CRUD kecil, tapi karena Hahahaha adalah seorang programmer .Net, tentunya dia harus menggunakan .Net untuk mengimplementasikannya. Hari ini kita akan menggunakan .Net untuk mengimplementasikan fungsi pengemasan format ekspresi CFC (custom face cab?).
Untuk mencapai fungsi ini, pertama-tama kita harus memahami format ini, Google terlebih dahulu. Kami menemukan artikel ini dari Universitas Tsinghua: Penjelasan detail tentang format file FC.
Dari artikel ini kami mengetahui bahwa format file CFC kira-kira sebagai berikut:
Sebuah blok mempunyai 15 field, sebagai berikut:
panjang string md5, panjang tombol pintasan 4 byte, panjang nama emotikon 4 byte, panjang nama file emotikon 4 byte, panjang file emotikon 4 byte, thumbnail 4 byte Panjang nama file, Panjang file miniatur 4-byte, nomor bingkai file emoticon 4-byte, gambar 4-byte md5 string bentuk tombol pintas nama file emoticon nama file emoticon nama file thumbnail konten file emoticon konten thumbnail Ketahui formatnya Selesai, mari kita tentukan struktur (struct) langkah demi langkah
1 Struktur#Struktur Wilayah
2 struktur publik FaceBlock
3 {
4 panjang MD5 uint publik; //32
5 panjang uint uint publik; //4
6 panjang Nama Wajah uint publik; //4
7 uint publik FaceFileNameLength; //36 md5 + ekstensi
8 Panjang File uint publik;
9 panjang nama file thumbnail uint publik; //41 md5 + tetap.bmp
10 Panjang File Thumbnail uint publik;
11 FrameLength uint publik;
12 string publik MD5;
13 pemotongan string publik;
14 string publik Nama Wajah;
15 string publik FaceFileName;
16 string publik Nama File Gambar Kecil;
17 byte publik[] FaceData;
18 byte publik[] ThumbnailData;
19
20 FaceBlock FromImage statis publik (file string)
dua puluh satu {
22 kembalikan FaceHelper.GetFaceBlockFromImage(file);
dua puluh tiga }
dua puluh empat
25 byte[] GetBytes(nilai uint)
26 {
27 byte[] bt = BitConverter.GetBytes(nilai);
28 Daftar<byte> byte = Daftar<byte>() baru;
29 byte.AddRange(bt);
30 jika (byte.Jumlah < 4)
31 {
32 int l = 4 - byte.Hitungan;
33 untuk (int saya = 0; saya < l; saya++)
34 byte.Tambahkan((byte)0);
35}
36 byte pengembalian.ToArray();
37 }
38
39 byte publik[]ToBytes()
40 {
41 Daftar<byte> byte = Daftar<byte>() baru;
42 Pengkodean e = Pengkodean.ASCII;
43 byte.AddRange(GetBytes(MD5Length));
44 byte.AddRange(GetBytes(uintcutLength));
45 byte.AddRange(GetBytes(FaceNameLength));
46 byte.AddRange(GetBytes(FaceFileNameLength));
47 byte.AddRange(GetBytes(FileLength));
48 byte.AddRange(GetBytes(ThumbnailFileNameLength));
49 byte.AddRange(GetBytes(ThumbnailFileLength));
50 byte.AddRange(GetBytes(FrameLength));
51
52 byte.AddRange(e.GetBytes(MD5));
53 byte.AddRange(e.GetBytes(uintcuts));
54 byte.AddRange(e.GetBytes(FaceName));
55 byte.AddRange(e.GetBytes(FaceFileName));
56 byte.AddRange(e.GetBytes(ThumbnailFileName));
57
58 byte.AddRange(FaceData);
59 byte.AddRange(ThumbnailData);
60
61 mengembalikan byte.ToArray();
62 }
63}
64 #endregion berisi dua metode, satu adalah metode statis untuk mendapatkan struktur ini dari file, dan yang lainnya adalah mengubah struktur ini menjadi array byte.
Mari buat kelas lain dan beri nama: FaceHelper
Kodenya adalah sebagai berikut:
FaceHelper kelas publik
{
FaceBlock statis internal GetFaceBlockFromImage (file string)
{
FaceBlock fb = FaceBlock baru();
//Buka aliran file
FileStream fs = FileStream baru(file, FileMode.Open, FileAccess.Read);
//Dapatkan gambarnya
Gambar img = Gambar.FromStream(fs);
//Dapatkan thumbnail berukuran 20*20
Gambar kecil gambar = img.GetThumbnailImage(20, 20, null, IntPtr.Zero);
MemoryStream ms = MemoryStream baru();
//Mengonversi gambar mini menjadi array byte
thumbnail.Simpan(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] thumbnailData = ms.ToArray();
ms.Tutup();
ms.Buang();
thumbnail.Dispose();
//Dapatkan string MD5 yang unik
string md5 = DapatkanMD5(fs);
//Nama file, formatnya adalah: md5 + ekstensi
string namafile = string.Format("{0}{1}", md5, Path.GetExtension(file));
//Nama file thumbnail, format: md5 + fixed.bmp
string thumbnailName = string.Format("{0}fixed.bmp", md5);
//Setel tombol pintasan acak
string uintcuts = "qq.5inet.net_" + RandomNum(6);
fs.Tutup();
fs.Dispose();
//Dapatkan jumlah total frame
System.Drawing.Imaging.FrameDimension fd = Sistem.Drawing.Imaging.FrameDimension.Resolution;
int frameCount = img.FrameDimensionsList.Panjang;
img.Buang();
fb.MD5 = md5;
fb.MD5Panjang = (uint)md5.Panjang;
fb.uintcuts = uintcuts;
fb.uintcutLength = (uint)uintcuts.Panjang;
fb.FaceName = uintcuts;
fb.FaceNameLength = (uint)uintcuts.Panjang;
fb.FaceFileName = Nama file;
fb.FaceFileNameLength = (uint)namafile.Panjang;
fb.ThumbnailFileName = nama thumbnail;
fb.ThumbnailFileNameLength = (uint)thumbnailName.Panjang;
fb.FaceData = File.ReadAllBytes(file);
fb.FileLength = (uint)fb.FaceData.Panjang;
fb.ThumbnailData = thumbnailData;
fb.ThumbnailFileLength = (uint)thumbnailData.Panjang;
fb.FrameLength = (uint)frameCount;
kembalikan fb;
}
Pembantu#Pembantu wilayah
//metode acak
string statis internal RandomNum(int n) //
{
string strchar = "0,1,2,3,4,5,6,7,8,9";
string[] VcArray = strchar.Split(',');
string VNum = "";//Karena stringnya sangat pendek, F77pclw,cnetworkG|?,ye,e'b tidak memerlukan StringBuilder
int temp = -1; //Catat nilai acak terakhir dan cobalah untuk menghindari menghasilkan beberapa angka acak yang identik.
//Gunakan algoritma sederhana untuk memastikan perbedaan angka acak yang dihasilkan
Rand acak = acak baru();
untuk (int saya = 1; saya < n + 1; saya++)
{
jika (suhu!= -1)
{
rand = new Random(i * temp * tidak dicentang((int)
DateTime.Now.Ticks));
}
//int t = rand.Berikutnya(35);
int t = rand.Berikutnya(10);
jika (suhu!= -1 && suhu == t)
{
kembalikan RandomNum(n);
}
suhu = t;
VNum += VcArray[t];
}
return VNum;//Kembalikan nomor acak yang dihasilkan
}
//Dapatkan MD5 dari nama file
string statis internal GetMD5(FileStream fs)
{
MD5CryptoServiceProvider md5 = MD5CryptoServiceProvider() baru;
byte[] md5byte = md5.ComputeHash(fs);
string str = string.Kosong;
ke dalam aku, j;
foreach (byte b dalam md5byte)
{
i = Konversi.ToInt32(b);
j = saya >> 4;
str += (Konversi.ToString(j, 16));
j = ((saya << 4) & 0x00ff) >> 4;
str += (Konversi.ToString(j, 16));
}
kembalikan str.ToUpper();
}
#endregion
//Buat kumpulan file CFC dari direktori
kekosongan statis publik
BuildCFCFileFromDirectory (direktori string)
{
Daftar<byte> byte = Daftar baru<byte>();
foreach (file string di Directory.GetFiles(direktori))
{
jika (!IsImageFile(file))
lanjutkan;
bytes.AddRange(FaceBlock.FromImage(file).ToBytes());
}
string fName = Path.Combine(direktori, Path.GetDirectoryName(direktori) + ".cfc");
FileStream fs = File.Buat(fName);
fs.Write(bytes.ToArray(), 0, bytes.Count);
fs.Tutup();
}
//Metode untuk menentukan apakah suatu file gambar relatif sederhana.
bool statis pribadi IsImageFile (file string)
{
Daftar<string> validExt = Daftar baru<string>(string baru[]{
".bmp",
".jpg",
".jpeg",
".gif",
".png",
});
mengembalikan validExt.Contains(Path.GetExtension(file).ToLower());
}
}
Oke, dengan cara diatas kita bisa menyebutnya.
Memanggil metode ini sangat sederhana.
FaceHelper.BuildCFCFileFromDirectory(Server.MapPath("~/img/"));
Tidak apa-apa. Sekarang buka direktori root situs web Anda dan lihat apakah ada file img.cfc? Klik dua kali lagi. Apakah semua file di direktori img telah diimpor ke emotikon QQ? Selamat menikmati coding!
Artikel ini pertama kali diterbitkan oleh: Wuyuan IT Teaching Network
http://www.cnblogs.com/skyover/archive/2006/10/03/520581.html