ความเป็นมา: ฉันไม่มีอะไรทำเมื่อเร็วๆ นี้ และตามคำขอของสมาชิกของฟอรัม ฉันต้องการสร้างเว็บไซต์สำหรับดาวน์โหลดอีโมติคอน QQ เดิมที สิ่งต่างๆ ง่ายมาก แค่เขียน CRUD เล็กๆ น้อยๆ แต่เนื่องจาก ฮ่าฮ่าฮ่าฮ่า เป็นโปรแกรมเมอร์ .Net แน่นอนว่าเขาต้องใช้ .Net เพื่อใช้งาน วันนี้เราจะใช้ .Net เพื่อใช้ฟังก์ชันบรรจุภัณฑ์ของรูปแบบนิพจน์ CFC (custom face cab?)
เพื่อให้บรรลุฟังก์ชันนี้ เราต้องเข้าใจรูปแบบนี้ก่อน Google ก่อน เราพบบทความนี้จากมหาวิทยาลัย Tsinghua: คำอธิบายโดยละเอียดเกี่ยวกับรูปแบบไฟล์ FC
จากบทความนี้ เราได้เรียนรู้ว่ารูปแบบไฟล์ CFC มีลักษณะดังนี้:
บล็อกมี 15 ฟิลด์ ดังนี้:
ความยาวสตริง md5, ความยาวคีย์ลัด 4 ไบต์, ความยาวชื่ออิโมติคอน 4 ไบต์, ความยาวชื่อไฟล์อิโมติคอน 4 ไบต์, ความยาวไฟล์อิโมติคอน 4 ไบต์, ภาพขนาดย่อ 4 ไบต์ ความยาวชื่อไฟล์ ความยาวไฟล์จิ๋ว 4 ไบต์, หมายเลขเฟรมไฟล์อิโมติคอน 4 ไบต์, รูปภาพ 4 ไบต์ md5 รูปแบบสตริงคีย์ลัด ชื่ออิโมติคอนชื่อไฟล์อิโมติคอนชื่อไฟล์ภาพย่อ ชื่อไฟล์เนื้อหาภาพย่อเนื้อหาอิโมติคอน เนื้อหาภาพขนาดย่อ เพิ่งรู้รูปแบบ เสร็จแล้วเรามากำหนดโครงสร้าง (struct) ทีละขั้นตอน
1 โครงสร้าง#โครงสร้างภูมิภาค
2 FaceBlock โครงสร้างสาธารณะ
3 {
4 สาธารณะ MD5Length; //32
5 สาธารณะ uintcutLength; //4
6 สาธารณะ Uint FaceNameLength; //4
7 uint สาธารณะ FaceFileNameLength; //36 md5 + ส่วนขยาย
8 ความยาวไฟล์สาธารณะ
9 สาธารณะ Uint ThumbnailFileNameLength; //41 md5 + fixed.bmp
10 สาธารณะ Uint ThumbnailFileLength;
11 สาธารณะ Uint FrameLength;
12 สตริงสาธารณะ MD5;
uintcuts สตริงสาธารณะ 13 รายการ;
14 สตริงสาธารณะ FaceName;
15 สตริงสาธารณะ FaceFileName;
16 สตริงสาธารณะ ThumbnailFileName;
17 ไบต์สาธารณะ [] FaceData;
18 ไบต์สาธารณะ [] ข้อมูลรูปขนาดย่อ;
19
20 FaceBlock FromImage แบบคงที่สาธารณะ (ไฟล์สตริง)
ยี่สิบเอ็ด {
22 ส่งคืน FaceHelper.GetFaceBlockFromImage (ไฟล์);
ยี่สิบสาม }
ยี่สิบสี่
25 ไบต์ [] GetBytes (ค่า uint)
26 {
27 ไบต์ [] bt = BitConverter.GetBytes (ค่า);
28 รายการ<ไบต์>ไบต์ = รายการใหม่<ไบต์>();
29 ไบต์AddRange(bt);
30 ถ้า (bytes.Count < 4)
31 {
32 int l = 4 - ไบต์นับ;
33 สำหรับ (int i = 0; i < l; i++)
34 ไบต์ เพิ่ม((ไบต์)0);
35}
36 ไบต์ส่งคืน ToArray();
37 }
38
39 ไบต์สาธารณะ[]ToBytes()
40 {
41 รายการ<ไบต์>ไบต์ = รายการใหม่<ไบต์>();
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 ไบต์AddRange(e.GetBytes(FaceName));
55 ไบต์ AddRange(e.GetBytes(FaceFileName));
56 ไบต์ AddRange(e.GetBytes(ThumbnailFileName));
57
58 ไบต์ AddRange (FaceData);
59 ไบต์ AddRange (ข้อมูลขนาดย่อ);
60
61 ไบต์ส่งคืน ToArray();
62 }
63}
64 #endregion มีสองวิธี วิธีแรกคือวิธีคงที่เพื่อรับโครงสร้างนี้จากไฟล์ และวิธีที่สองคือการแปลงโครงสร้างนี้เป็นอาร์เรย์ไบต์
มาสร้างคลาสอื่นแล้วตั้งชื่อว่า FaceHelper
รหัสมีดังนี้:
FaceHelper ชั้นเรียนสาธารณะ
-
FaceBlock แบบคงที่ภายใน GetFaceBlockFromImage (ไฟล์สตริง)
-
FaceBlock fb = FaceBlock ใหม่();
//เปิดสตรีมไฟล์
FileStream fs = FileStream ใหม่ (ไฟล์, FileMode.Open, FileAccess.Read);
//รับภาพครับ
รูปภาพ img = Image.FromStream(fs);
//รับภาพย่อขนาด 20*20
ภาพขนาดย่อ = img.GetThumbnailImage(20, 20, null, IntPtr.Zero);
MemoryStream ms = MemoryStream ใหม่ ();
//แปลงภาพขนาดย่อให้เป็นอาร์เรย์ไบต์
รูปขนาดย่อ.บันทึก(ms, System. Drawing.Imaging.ImageFormat.Bmp);
ไบต์ [] ข้อมูลขนาดย่อ = ms.ToArray();
ms.ปิด();
ms.ทิ้ง();
thumbnail.Dispose();
// รับสตริง MD5 ที่ไม่ซ้ำใคร
สตริง md5 = GetMD5(fs);
//ชื่อไฟล์ รูปแบบคือ: md5 + นามสกุล
string fileName = string.Format("{0}{1}", md5, Path.GetExtension(ไฟล์));
//ชื่อไฟล์ภาพขนาดย่อ, รูปแบบ: md5 + fixed.bmp
string thumbnailName = string.Format("{0}fixed.bmp", md5);
// ตั้งค่าคีย์ลัดแบบสุ่ม
string uintcuts = "qq.5inet.net_" + RandomNum(6);
fs.ปิด();
fs.Dispose();
//รับจำนวนเฟรมทั้งหมด
System. Drawing.Imaging.FrameDimension fd = System. Drawing.Imaging.FrameDimension.Resolution;
int frameCount = img.FrameDimensionsList.Length;
img.ทิ้ง();
fb.MD5 = md5;
fb.MD5Length = (uint)md5.ความยาว;
fb.uintcuts = uintcuts;
fb.uintcutLength = (uint)uintcuts.Length;
fb.FaceName = uintcuts;
fb.FaceNameLength = (uint)uintcuts.Length;
fb.FaceFileName = ชื่อไฟล์;
fb.FaceFileNameLength = (uint)fileName.Length;
fb.ThumbnailFileName = ชื่อรูปขนาดย่อ;
fb.ThumbnailFileNameLength = (uint)thumbnailName.Length;
fb.FaceData = ไฟล์ ReadAllBytes (ไฟล์);
fb.FileLength = (uint)fb.FaceData.Length;
fb.ThumbnailData = ข้อมูลรูปขนาดย่อ;
fb.ThumbnailFileLength = (uint)thumbnailData.Length;
fb.FrameLength = (uint)frameCount;
กลับ fb;
}
ตัวช่วย#ตัวช่วยภูมิภาค
//วิธีการสุ่ม
สตริงคงที่ภายใน RandomNum (int n) //
-
สตริง strchar = "0,1,2,3,4,5,6,7,8,9";
สตริง[] VcArray = strchar.Split(',');
string VNum = "";//เนื่องจากสตริงสั้นมาก F77pclw,cnetworkG|?, ใช่แล้วไม่จำเป็นต้องใช้ StringBuilder
int temp = -1; //บันทึกค่าสุ่มสุดท้ายและพยายามหลีกเลี่ยงการสร้างตัวเลขสุ่มที่เหมือนกันหลายตัว
//ใช้อัลกอริธึมง่ายๆ เพื่อให้แน่ใจว่าตัวเลขสุ่มที่สร้างขึ้นมีความแตกต่างกัน
สุ่มแรนด์ = สุ่มใหม่ ();
สำหรับ (int i = 1; i <n + 1; i++)
-
ถ้า (อุณหภูมิ != -1)
-
rand = สุ่มใหม่ (i * temp * ไม่ได้เลือก ((int)
DateTime.Now.Ticks));
-
//int t = rand.ถัดไป(35);
int t = rand ถัดไป (10);
ถ้า (อุณหภูมิ != -1 && อุณหภูมิ == t)
-
กลับ RandomNum (n);
-
อุณหภูมิ = เสื้อ;
VNum += VcArray[t];
-
return VNum;//ส่งคืนตัวเลขสุ่มที่สร้างขึ้น
}
//รับ MD5 จากชื่อไฟล์
สตริงคงที่ภายใน GetMD5 (FileStream fs)
-
MD5CryptoServiceProvider md5 = MD5CryptoServiceProvider ใหม่();
ไบต์ [] md5byte = md5.ComputeHash (fs);
สตริง str = สตริงว่าง;
อินท์ฉันเจ;
foreach (ไบต์ b ใน md5byte)
-
i = Convert.ToInt32(b);
เจ = ฉัน >> 4;
str += (แปลง.ToString(j, 16));
เจ = ((ฉัน << 4) & 0x00ff) >> 4;
STR += (แปลง.ToString(j, 16));
}
ส่งคืน str.ToUpper();
-
#endregion
//สร้างคอลเลกชั่นไฟล์ CFC จากไดเร็กทอรี
โมฆะคงที่สาธารณะ
BuildCFCFileFromDirectory (ไดเร็กทอรีสตริง)
-
รายการ<ไบต์>ไบต์ = รายการใหม่<ไบต์>();
foreach (ไฟล์สตริงใน Directory.GetFiles(directory))
-
ถ้า (!IsImageFile(ไฟล์))
ดำเนินการต่อ;
bytes.AddRange(FaceBlock.FromImage(file).ToBytes());
}
string fName = Path.Combine (ไดเร็กทอรี, Path.GetDirectoryName (ไดเร็กทอรี) + ".cfc");
FileStream fs = File.Create (fName);
fs.Write(bytes.ToArray(), 0, ไบต์.นับ);
fs.ปิด();
}
//วิธีการตรวจสอบว่าเป็นไฟล์รูปภาพนั้นค่อนข้างง่าย
IsImageFile บูลคงที่ส่วนตัว (ไฟล์สตริง)
-
รายการ<string> validExt = รายการใหม่<string>(สตริงใหม่[]{
".บีเอ็มพี",
".jpg",
".เจเพ็ก",
".กิฟ"
".png",
});
กลับ validExt.Contains(Path.GetExtension(file).ToLower());
-
-
เอาล่ะ ด้วยวิธีการข้างต้นเราเรียกมันว่า
การเรียกวิธีการนั้นง่ายมาก
FaceHelper.BuildCFCFileFromDirectory(Server.MapPath("~/img/"));
ไม่เป็นไร ตอนนี้ไปที่ไดเร็กทอรีรากของเว็บไซต์ของคุณแล้วดูว่ามีไฟล์ img.cfc หรือไม่? ดับเบิลคลิกอีกครั้ง ไฟล์ทั้งหมดในไดเร็กทอรี img ได้ถูกนำเข้าไปยังอิโมติคอน QQ แล้วหรือยัง?
บทความนี้เผยแพร่ครั้งแรกโดย: Wuyuan IT Teaching
Network
http://www.cnblogs.com/skyover/archive/2006/10/03/520581.html