يحمل كل بكسل في صورة bmp معلومات حول لونها من نموذج RGB (نموذج ألوان الصورة ، والذي يتكون من ثلاثة مكونات R - أحمر ، G - أخضر ، B - أزرق). من الأنسب تخزين قيمة ألوان RGB بتنسيق سداسي عشري (سداسي عشري) ، حيث تكون قيمة كل مكون في النطاق 00… FF. التركيبة 000000 تقابل الأسود ، FFFFFF - إلى الأبيض.
للبدء ، دعنا نفتح مساحة اسم الرسم:
باستخدام System. Drawing ؛
لنقم بإنشاء مثيل جديد لفئة Bitmap:
صورة نقطية bmp = صورة نقطية جديدة ("c: / 1.bmp") / / c: / 1.bmp - عنوان الصورة
لتخزين قيمة لون البكسل ، يمكنك إنشاء بنية منفصلة ، تكون حقولها عبارة عن مكونات RGB ، لكنني قررت استخدام فئة اللون من مساحة الاسم Drawing. للحصول على اللون ، نستخدم طريقة GetPixel (x ، y) ، حيث x ، y هما إحداثيات بكسل الصورة. إذا كنت تريد استخدام الهيكل الخاص بك لتخزين اللون ، بدلاً من مثيل لفئة اللون ، فيمكنك استخدام طريقة bmp. GetPixel (x ، y).x للحصول على مكون RGB واحد ، حيث x هي R ، G أو B.
اللون [،] اللون = لون جديد [bmp. Width، bmp. Height]؛
لـ (int y = 0 ؛ y <bmp.eight ؛ y ++)
لـ (int x = 0 ؛ x <bmp. Width ؛ x ++)
{
اللون [x، y] = bmp. GetPixel (x، y) ؛
}
لكتابة قيم اللون إلى ملف ، نستخدم فئة StreamWriter. نظرًا لأن عناصر R و G و B لمثيل اللون هي من نوع البايت ، فإننا نحولها باستخدام طريقة ToString ("X2") إلى نوع سلسلة يخزن القيم السداسية لعناصر RGB.
StreamWriter steamWriter = StreamWriter الجديد ("c: / 1.txt") ؛
لـ (int y = 0 ؛ y <bmp.eight ؛ y ++)
{
لـ (int x = 0 ؛ x <bmp. Width ؛ x ++)
{
steamWriter. Write (color [x، y]. R. ToString ("X2")) ؛
steamWriter. Write (اللون [x، y]. G. ToString ("X2")) ؛
steamWriter. Write (color [x، y]. B. ToString ("X2") + ") ؛
}
steamWriter. WriteLine () ،
}
steamWriter. Close () ،
الآن دعنا ننفذ العملية العكسية - تحويل الملف النصي الناتج إلى صورة.
بمساعدة StreamReader نقرأ المعلومات من الملف.
StreamReader txtFile = جديد StreamReader ("c: / 1.txt") ؛
نحسب عرض الصورة وارتفاعها. نظرًا لأن كل بكسل يأخذ 6 أحرف وفجوة واحدة ، ولا توجد فجوة في النهاية ، فإننا نستخدم الصيغة التالية لحساب العرض:
temp = txtFile. ReadLine () ،
العرض = (temp. Length + 1) / 7 ؛
ارتفاع الصورة هو عدد الأسطر في الملف:
بينما (! txtFile. EndOfStream)
{
txtFile. ReadLine () ،
الارتفاع ++ ؛
}
الارتفاع ++ ؛
حرك مؤشر القراءة في الملف إلى البداية:
txtFile. DiscardBufferedData () ،
قم بإنشاء مثيل جديد لفئة Bitmap:
صورة نقطية bmp2 = صورة نقطية جديدة (عرض ، ارتفاع) ؛
باستخدام طريقة الانقسام ، قمنا بتقسيم عناصر المصفوفة. نعلن عن ثلاثة متغيرات من نوع البايت - R ، G ، B. باستخدام طرق التحليل و Substring ، حدد عناصر اللون بشكل منفصل.
لتعبئة البكسل في الصورة بهذا اللون ، استخدم طريقة SetPixel (j، i، Color. FromArgb (R، G، B)) ، حيث j ، i هي إحداثيات الصورة ، اللون.) هي الطريقة التي تخلق بنية اللون.
لـ (int i = 0 ؛ i <height ؛ i + +)
{
temp = txtFile2. ReadLine () ،
سلسلة substring = temp. Split ('') ؛
لـ (int j = 0 ؛ j <العرض ؛ j + +)
{
R = byte. Parse (سلسلة فرعية [j]. سلسلة فرعية (0 ، 2) ،
System. Globalization. NumberStyles. HexNumber)
G = byte. Parse (سلسلة فرعية [j]. سلسلة فرعية (2 ، 2) ،
System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (سلسلة فرعية [j]. سلسلة فرعية (4، 2) ،
System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j، i، Color. FromArgb (R، G، B)) ؛
}
}
الآن يمكنك حفظ الصور. إذا كنت تعمل في WindowsForm ، فيمكنك استخدام فئة SaveFileDialog:
SaveFileDialog saveImage = new SaveFileDialog () ،
saveImage. Filter = ملفات bmp (*. bmp) | *. bmp | كافة الملفات (*. *)
| *. * ;
saveImage. ShowDialog () ،
bmp2. Save (saveImage. FileName) ،