Bir bmp görüntüsünün her pikseli, RGB modelinden (R - kırmızı, G - yeşil, B - mavi olmak üzere üç bileşenden oluşan görüntünün renk modeli) rengi hakkında bilgi taşır. RGB renk değerini, her bir bileşenin değerinin 00… FF aralığında olduğu onaltılık biçimde (onaltılık) depolamak daha uygundur. 000000 kombinasyonu siyaha, FFFFFF - beyaza karşılık gelir.
Başlamak için Drawing ad alanını açalım:
System. Drawing'i kullanarak;
Bitmap sınıfının yeni bir örneğini oluşturalım:
Bitmap bmp = yeni Bitmap ("c: / 1.bmp") / / c: / 1.bmp - resim adresi
Piksel renk değerini saklamak için alanları RGB bileşenleri olan ayrı bir yapı oluşturabilirsiniz ama ben Drawing namespace'den Color sınıfını kullanmaya karar verdim. Rengi elde etmek için GetPixel (x, y) yöntemini kullanırız, burada x, y görüntü pikselinin koordinatlarıdır. Rengi depolamak için Color sınıfının bir örneği yerine kendi yapınızı kullanmak istiyorsanız, x'in R olduğu tek bir RGB bileşeni elde etmek için bmp. GetPixel (x, y).x yöntemini kullanabilirsiniz. G veya B.
Renk [,] renk = yeni Renk [bmp. Width, bmp. Height];
for (int y = 0; y <bmp. Yükseklik; y ++)
for (int x = 0; x <bmp. Width; x ++)
{
renk [x, y] = bmp. GetPixel (x, y);
}
Bir dosyaya renk değerleri yazmak için StreamWriter sınıfını kullanıyoruz. Color örneğinin R, G, B elemanları byte türünde olduğu için ToString ("X2") yöntemini kullanarak RGB elemanlarının hex değerlerini saklayacak bir string tipine çeviriyoruz.
StreamWriter steamWriter = yeni StreamWriter ("c: / 1.txt");
for (int y = 0; y <bmp. Yükseklik; y ++)
{
for (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (renk [x, y]. R. ToString ("X2"));
steamWriter. Write (renk [x, y]. G. ToString ("X2"));
steamWriter. Write (renk [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine();
}
steamWriter. Close ();
Şimdi ters işlemi gerçekleştirelim - ortaya çıkan metin dosyasını bir görüntüye dönüştürün.
StreamReader yardımıyla dosyadan bilgi okuyoruz.
StreamReader txtFile = yeni StreamReader ("c: / 1.txt");
Resmin genişliğini ve yüksekliğini hesaplıyoruz. Her piksel 6 karakter ve 1 boşluk aldığından ve sonunda boşluk olmadığından, genişliği hesaplamak için aşağıdaki formülü kullanırız:
temp = txtFile. ReadLine();
genişlik = (sıcaklık. Uzunluk + 1) / 7;
Görüntü yüksekliği, dosyadaki satır sayısıdır:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine();
yükseklik ++;
}
yükseklik ++;
Dosyadaki okuma işaretçisini en başa taşıyın:
txtFile. DiscardBufferedData();
Bitmap sınıfının yeni bir örneğini oluşturun:
Bitmap bmp2 = yeni Bitmap (genişlik, yükseklik);
Bölme yöntemini kullanarak matrisin öğelerini böldük. Bayt türünde üç değişken tanımlıyoruz - R, G, B. Parse ve Substring yöntemlerini kullanarak renk öğelerini ayrı ayrı seçin.
Görüntüdeki pikseli bu renkle doldurmak için SetPixel (j, i, Color. FromArgb (R, G, B)) yöntemini kullanın, burada j, i görüntü koordinatlarıdır, Color. FromArgb (R, G, B)) Renk yapısını oluşturan yöntemdir.
for (int i = 0; i <yükseklik; i + +)
{
temp = txtFile2. ReadLine();
string substring = temp. Split ('');
for (int j = 0; j <genişlik; j + +)
{
R = byte. Parse (alt dizi [j]. Alt dize (0, 2)), System. Globalization. NumberStyles. HexNumber)
G = byte. Parse (alt dizi [j]. Alt dize (2, 2)), System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (alt dizi [j]. Alt dize (4, 2)),
System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Artık görüntüleri kaydedebilirsiniz. WindowsForm'da çalışıyorsanız SaveFileDialog sınıfını kullanabilirsiniz:
SaveFileDialog saveImage = yeni SaveFileDialog ();
saveImage. Filter = bmp dosyaları (*. bmp) | *. bmp | Tüm dosyalar (*. *)
| *. * ;
saveImage. ShowDialog();
bmp2. Save (saveImage. FileName);