كيفية تحويل صور RGB إلى نص

كيفية تحويل صور RGB إلى نص
كيفية تحويل صور RGB إلى نص
Anonim

يحمل كل بكسل في صورة bmp معلومات حول لونها من نموذج RGB (نموذج ألوان الصورة ، والذي يتكون من ثلاثة مكونات R - أحمر ، G - أخضر ، B - أزرق). من الأنسب تخزين قيمة ألوان RGB بتنسيق سداسي عشري (سداسي عشري) ، حيث تكون قيمة كل مكون في النطاق 00… FF. التركيبة 000000 تقابل الأسود ، FFFFFF - إلى الأبيض.

كيفية تحويل صور RGB إلى نص
كيفية تحويل صور RGB إلى نص

للبدء ، دعنا نفتح مساحة اسم الرسم:

باستخدام 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) ،

موصى به: