هر پیکسل از یک تصویر bmp اطلاعات مربوط به رنگ آن را از مدل RGB حمل می کند (مدل رنگی تصویر که از سه جز R R - قرمز ، G - سبز ، B - آبی تشکیل شده است). راحت تر است که مقدار رنگ RGB را در قالب هگز (هگزادسیمال) ذخیره کنید ، جایی که مقدار هر جز component در محدوده 00… FF باشد. ترکیب 000000 مربوط به سیاه و سفید ، FFFFFF - به سفید است.
برای شروع ، بیایید فضای نامی Drawing را باز کنیم:
با استفاده از System. Drawing ؛
بیایید یک نمونه جدید از کلاس Bitmap ایجاد کنیم:
Bitmap bmp = Bitmap جدید ("c: / 1.bmp") / / c: / 1.bmp - آدرس تصویر
برای ذخیره مقدار رنگ پیکسل ، می توانید یک ساختار جداگانه ایجاد کنید که قسمت های آن اجزای RGB هستند ، اما من تصمیم گرفتم از کلاس Color از فضای نام Drawing استفاده کنم. برای به دست آوردن رنگ ، از روش GetPixel (x، y) استفاده می کنیم ، جایی که x ، y مختصات پیکسل تصویر هستند. اگر می خواهید به جای نمونه ای از کلاس Color ، از ساختار خود برای ذخیره رنگ استفاده کنید ، می توانید از روش bmp. GetPixel (x، y).x برای بدست آوردن یک م Rلفه RGB واحد استفاده کنید ، که x R است ، G یا B
رنگ [،] رنگ = رنگ جدید [bmp. Width ، bmp. Hight]؛
for (int y = 0؛ y <bmp. Hight؛ y ++)
برای (int x = 0؛ x <bmp. Width؛ x ++)
{
رنگ [x ، y] = bmp. GetPixel (x ، y) ؛
}
برای نوشتن مقادیر رنگی در یک پرونده ، از کلاس StreamWriter استفاده می کنیم. از آنجایی که عناصر R ، G ، B نمونه Color از نوع بایت هستند ، ما آنها را با استفاده از روش ToString ("X2") به نوع رشته ای تبدیل می کنیم که مقادیر hex عناصر RGB را ذخیره می کند.
StreamWriter steamWriter = جدید StreamWriter ("c: / 1.txt")؛
for (int y = 0؛ y <bmp. Hight؛ y ++)
{
برای (int x = 0؛ x <bmp. Width؛ x ++)
{
steamWriter. Write (رنگ [x، y]. R. ToString ("X2"))؛
steamWriter. Write (رنگ [x، y]. G. ToString ("X2"))؛
steamWriter. Write (رنگ [x، y]. B. ToString ("X2") + ")؛
}
steamWriter. WriteLine ()؛
}
steamWriter. Close ()؛
حال بیایید عملیات معکوس را انجام دهیم - فایل متنی حاصل را به تصویر تبدیل کنید.
با کمک StreamReader اطلاعات موجود در پرونده را می خوانیم.
StreamReader txtFile = new StreamReader ("c: / 1.txt")؛
عرض و ارتفاع تصویر را محاسبه می کنیم. از آنجا که هر پیکسل 6 کاراکتر و 1 فاصله دارد و در انتها شکافی وجود ندارد ، برای محاسبه عرض از فرمول زیر استفاده می کنیم:
temp = txtFile. ReadLine ()؛
عرض = (دما طول + 1) / 7 ؛
ارتفاع تصویر تعداد خطوط موجود در پرونده است:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ()؛
قد ++؛
}
قد ++؛
نشانگر خوانده شده در پرونده را به ابتدا منتقل کنید:
txtFile. DiscardBufferedData ()؛
نمونه جدیدی از کلاس Bitmap ایجاد کنید:
Bitmap bmp2 = Bitmap جدید (عرض ، ارتفاع) ؛
با استفاده از روش تقسیم ، عناصر ماتریس را تقسیم می کنیم. ما سه متغیر از نوع بایت را اعلام می کنیم - R ، G ، B. با استفاده از روشهای Parse و Substring ، عناصر رنگ را جداگانه انتخاب کنید.
برای پر کردن پیکسل تصویر با این رنگ ، از روش SetPixel (j ، i ، Color. FromArgb (R ، G ، B)) استفاده کنید ، جایی که j ، من مختصات تصویر است ، Color. FromArgb (R ، G ، B)) روشی است که ساختار Color را ایجاد می کند.
for (int i = 0؛ i <height؛ i + +)
{
temp = txtFile2. ReadLine ()؛
رشته substring = temp. Split ('')؛
for (int j = 0؛ j <width؛ j + +)
{
R = بایت. تجزیه (زیر رشته [j]. زیر رشته (0 ، 2) ،
System. Globalization. NumberStyles. HexNumber)
G = بایت. تجزیه (زیر رشته [j]. زیر رشته (2 ، 2) ،
System. Globalization. NumberStyles. HexNumber)
B = بایت. تجزیه (زیر رشته [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)؛