الخلفية: ليس لدي أي شيء أفعله مؤخرًا، وبناءً على طلب أحد أعضاء المنتدى، أردت إنشاء موقع لتحميل رموز QQ التعبيرية. في الأصل، كانت الأمور بسيطة للغاية، فقط اكتب CRUD صغيرًا، ولكن بما أن هههههههه هو مبرمج .Net، فيجب عليه بالطبع استخدام .Net لتنفيذه. سنستخدم اليوم .Net لتنفيذ وظيفة التغليف لتنسيق التعبير CFC (كابينة وجه مخصصة؟).
لتحقيق هذه الوظيفة، يجب علينا أولاً أن نفهم هذا التنسيق، ونبحث عنه أولاً في Google. لقد وجدنا هذه المقالة من جامعة تسينغهوا: شرح تفصيلي لتنسيق ملف FC
من هذه المقالة علمنا أن تنسيق ملف CFC هو تقريبًا كما يلي:
تحتوي الكتلة على 15 حقلاً، على النحو التالي:
طول سلسلة md5، طول مفتاح الاختصار 4 بايت، طول اسم الرمز التعبيري 4 بايت، طول اسم ملف التعبير 4 بايت، طول ملف التعبير 4 بايت، طول اسم الملف المصغر 4 بايت، طول ملف مصغر 4 بايت، رقم إطار ملف التعبيرات 4 بايت، صورة سلسلة md5 4 بايت، مفتاح الاختصار، اسم الرمز التعبيري، اسم ملف التعبيرات، اسم الملف المصغر، محتوى ملف التعبيرات، المحتوى المصغر، تعرف فقط على التنسيق تم، دعنا نحدد البنية (البنية) خطوة بخطوة
1 هيكل # هيكل المنطقة
2 البنية العامة FaceBlock
3 {
4 uint MD5Length العامة //32
5 uint uintcutLength العامة //4
6. uint العام FaceNameLength;
7 public uint FaceFileNameLength;//36 md5 + Extension
8 طول ملف uint العام؛
9 public uint ThumbnailFileNameLength;//41 md5 + Fixed.bmp
10 uint العامة ThumbnailFileLength;
11 وحدة عامة طول الإطار؛
12 سلسلة عامة MD5؛
13 uintcuts سلسلة عامة؛
14 سلسلة عامة اسم الوجه؛
15 سلسلة عامة FaceFileName؛
16 سلسلة عامة ThumbnailFileName؛
17 بايت عام[] FaceData;
18 بايت عام[] ThumbnailData;
19
20 FaceBlock عام ثابت من Image (ملف سلسلة)
واحد وعشرون {
22 return FaceHelper.GetFaceBlockFromImage(file);
ثلاثة وعشرين }
أربعة وعشرون
25 بايت [] GetBytes (قيمة uint)
26 {
27 بايت[] bt = BitConverter.GetBytes(value);
28 List
29 بايت.AddRange(bt);
30 إذا (عدد البايتات <4)
31 {
32 int l = 4 - bytes.Count;
33 لـ (int i = 0; i < l; i++)
34 بايت. إضافة((بايت)0);
35}
36 بايت إرجاع.ToArray();
37 }
38
39 بايت عام[]ToBytes()
40 {
41 List
42 الترميز 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 بايت.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 بايت.AddRange(FaceData);
59 bytes.AddRange(ThumbnailData);
60
61 بايت إرجاع.ToArray();
62 }
63}
64 #endregion يحتوي على طريقتين، إحداهما طريقة ثابتة للحصول على هذه البنية من الملف، والأخرى هي تحويل هذه البنية إلى مصفوفة بايت.
لنقم بإنشاء فئة أخرى ونطلق عليها اسم: FaceHelper
الرمز هو كما يلي:
FaceHelper من الفئة العامة
{
FaceBlock الداخلي الثابت GetFaceBlockFromImage (ملف سلسلة)
{
FaceBlock fb = new FaceBlock();
// فتح دفق الملف
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
// احصل على الصورة
Image img = Image.FromStream(fs);
// احصل على صورة مصغرة مقاس 20*20
الصورة المصغرة = img.GetThumbnailImage(20, 20, null, IntPtr.Zero);
MemoryStream ms = new MemoryStream();
// تحويل الصورة المصغرة إلى مصفوفة بايت
الصورة المصغرة.حفظ(ms, System.Drawing.Imaging.ImageFormat.Bmp);
بايت[] بيانات مصغرة = ms.ToArray();
ms.Close();
ms.Dispose();
الصورة المصغرة.Dispose();
// احصل على سلسلة MD5 فريدة
سلسلة md5 = GetMD5(fs);
//اسم الملف، التنسيق هو: md5 + الامتداد
string fileName = string.Format("{0}{1}", md5, Path.GetExtension(file));
// اسم ملف الصورة المصغرة، التنسيق: md5 + Fixed.bmp
string MininameName = 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;
intframeCount = img.FrameDimensionsList.Length;
img.Dispose()
;
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 = الصورة المصغرة;
fb.ThumbnailFileNameLength = (uint)thumbnailName.Length;
fb.FaceData = File.ReadAllBytes(file);
fb.FileLength = (uint)fb.FaceData.Length;
fb.ThumbnailData = بيانات مصغرة؛
fb.ThumbnailFileLength = (uint)thumbnailData.Length;
fb.FrameLength = (uint)frameCount;
return fb;
}
مساعد # المنطقة مساعد
// طريقة عشوائية
سلسلة ثابتة داخلية 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; // سجل آخر قيمة عشوائية وحاول تجنب إنشاء عدة أرقام عشوائية متطابقة.
// استخدم خوارزمية بسيطة للتأكد من الاختلاف في الأرقام العشوائية التي تم إنشاؤها
راند عشوائي = جديد عشوائي ()؛
لـ (int i = 1; i < n + 1; i++)
{
إذا (درجة الحرارة ! = -1)
{
rand = new Random(i * temp * unchecked((int)
DateTime.Now.Ticks));
}
//int t = rand.Next(35);
int t = rand.Next(10);
إذا (درجة الحرارة != -1 && درجة الحرارة == ر)
{
إرجاع RandomNum(n);
}
درجة الحرارة = ر؛
VNum += VcArray[t];
}
return VNum;// إرجاع الرقم العشوائي الذي تم إنشاؤه
}
// احصل على MD5 من اسم الملف
سلسلة ثابتة داخلية GetMD5(FileStream fs)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] md5byte = md5.ComputeHash(fs);
سلسلة سلسلة = سلسلة. فارغة؛
كثافة العمليات ط، ي؛
foreach (بايت ب في md5byte)
{
i = Convert.ToInt32(b);
ي = أنا >> 4;
str += (Convert.ToString(j, 16));
ي = ((i << 4) & 0x00ff) >> 4;
str += (Convert.ToString(j, 16));
}
return str.ToUpper();
}
#endregion
// أنشئ مجموعة ملفات CFC من الدليل
الفراغ الساكن العام
BuildCFCFileFromDirectory (دليل السلسلة)
{
List
foreach (ملف سلسلة في Directory.GetFiles(directory))
{
إذا (! IsImageFile (ملف))
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();
}
// طريقة تحديد ما إذا كان ملف صورة بسيطة نسبيًا.
المنطق المنطقي الثابت الخاص IsImageFile (ملف سلسلة)
{
قائمة
".bmp"،
".jpg"،
".jpeg"،
".gif"،
".png"،
});
return validExt.Contains(Path.GetExtension(file).ToLower());
}
}
حسنًا، بالطريقة المذكورة أعلاه، يمكننا أن نسميها.
استدعاء الطريقة بسيط حقًا.
FaceHelper.BuildCFCFileFromDirectory(Server.MapPath("~/img/"));
حسنًا، انتقل الآن إلى الدليل الجذر لموقع الويب الخاص بك ومعرفة ما إذا كان هناك ملف img.cfc؟ انقر نقرًا مزدوجًا مرة أخرى. هل تم استيراد جميع الملفات الموجودة في دليل img إلى رموز QQ؟ استمتع بالبرمجة!
تم نشر هذه المقالة في الأصل بواسطة: شبكة تدريس تكنولوجيا المعلومات Wuyuan
http://www.cnblogs.com/skyover/archive/2006/10/03/520581.html