Chaque pixel d'une image bmp porte des informations sur sa couleur du modèle RVB (le modèle de couleur de l'image, qui se compose de trois composants R - rouge, G - vert, B - bleu). Il est plus pratique de stocker la valeur de couleur RVB au format hexadécimal (hexadécimal), où la valeur de chaque composant est comprise entre 00… FF. La combinaison 000000 correspond au noir, FFFFFF - au blanc.
Pour commencer, ouvrons l'espace de noms Drawing:
en utilisant System. Drawing;
Créons une nouvelle instance de la classe Bitmap:
Bitmap bmp = nouveau Bitmap ("c:\1.bmp") //c:\1.bmp - adresse de l'image
Pour stocker la valeur de couleur du pixel, vous pouvez créer une structure distincte, dont les champs sont des composants RVB, mais j'ai décidé d'utiliser la classe Color de l'espace de noms Drawing. Pour obtenir la couleur, nous utilisons la méthode GetPixel (x, y), où x, y sont les coordonnées du pixel de l'image. Si vous souhaitez utiliser votre propre structure pour stocker la couleur, plutôt qu'une instance de la classe Color, vous pouvez utiliser la méthode bmp. GetPixel (x, y).x pour obtenir un seul composant RVB, où x est R, G, ou B.
Couleur [,] couleur = nouvelle Couleur [bmp. Largeur, bmp. Hauteur];
pour (int y = 0; y <bmp. Height; y ++)
pour (int x = 0; x <bmp. Width; x ++)
{
couleur [x, y] = bmp. GetPixel (x, y);
}
Pour écrire des valeurs de couleur dans un fichier, nous utilisons la classe StreamWriter. Étant donné que les éléments R, G, B de l'instance Color sont de type byte, nous les convertissons à l'aide de la méthode ToString ("X2") en un type de chaîne qui stockera les valeurs hexadécimales des éléments RVB.
StreamWriter steamWriter = nouveau StreamWriter ("c: / 1.txt");
pour (int y = 0; y <bmp. Height; y ++)
{
pour (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (couleur [x, y]. R. ToString ("X2"));
steamWriter. Write (couleur [x, y]. G. ToString ("X2"));
steamWriter. Write (couleur [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Fermer ();
Effectuons maintenant l'opération inverse - convertissez le fichier texte résultant en une image.
Avec l'aide de StreamReader, nous lisons les informations du fichier.
StreamReader txtFile = nouveau StreamReader ("c: / 1.txt");
Nous calculons la largeur et la hauteur de l'image. Étant donné que chaque pixel prend 6 caractères et 1 espace, et qu'il n'y a pas d'espace à la fin, nous utilisons la formule suivante pour calculer la largeur:
temp = txtFile. ReadLine ();
largeur = (temp. Longueur + 1) / 7;
La hauteur de l'image est le nombre de lignes dans le fichier:
tandis que (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
hauteur ++;
}
hauteur ++;
Déplacez le pointeur de lecture dans le fichier au début:
txtFile. DiscardBufferedData ();
Créez une nouvelle instance de la classe Bitmap:
Bitmap bmp2 = nouveau Bitmap (largeur, hauteur);
En utilisant la méthode split, nous divisons les éléments de la matrice. Nous déclarons trois variables de type octet - R, G, B. À l'aide des méthodes Parse et Substring, sélectionnez les éléments de couleur séparément.
Pour remplir le pixel de l'image avec cette couleur, utilisez la méthode SetPixel (j, i, Color. FromArgb (R, G, B)), où j, i sont les coordonnées de l'image, Color. FromArgb (R, G, B) est la méthode qui crée la structure Color.
pour (int i = 0; i <hauteur; i + +)
{
temp = txtFile2. ReadLine ();
chaîne sous-chaîne = temp. Split ('');
pour (int j = 0; j <largeur; j + +)
{
R = byte. Parse (sous-chaîne [j]. Sous-chaîne (0, 2), System. Globalization. NumberStyles. HexNumber)
G = byte. Parse (sous-chaîne [j]. Sous-chaîne (2, 2), System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (sous-chaîne [j]. Sous-chaîne (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, V, B));
}
}
Vous pouvez maintenant enregistrer les images. Si vous travaillez sous WindowsForm, vous pouvez utiliser la classe SaveFileDialog:
SaveFileDialog saveImage = new SaveFileDialog ();
saveImage. Filter = fichiers bmp (*. bmp) | *. bmp | Tous les fichiers (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);