2016-03-13 1 views
0

Je suis en train de créer un simple format d'image, qui écrit pour chaque pixel la couleur ARVB dans un fichier, je le code pour obtenir et définir tousC# lecture/écriture des couleurs de pixels ne fonctionne pas

List<Color> pixels = new List<Color>(); 
Bitmap img = new Bitmap("*imagePath*"); 

for (int i = 0; i < img.Width; i++) 
{ 
for (int j = 0; j < img.Height; j++) 
{ 
    Color pixel = img.GetPixel(i,j); 
    pixels.Add(pixel); 
} 
} 

de :

How can I read image pixels' values as RGB into 2d array?

Et puis j'écris chaque pixel sur une nouvelle ligne:

foreach(Color p in pixels) 
{ 
    streamWriter.WriteLine(p.ToArgb) 
} 
streamWriter.Close(); 

puis si je tente de le lire:

 OpenFileDialog op = new OpenFileDialog(); 
     op.ShowDialog(); 
     StreamReader sr = new StreamReader(op.FileName); 
     int x = 1920; 
     int y = 1080; 
     Bitmap img = new Bitmap(x,y); 
     for (int i = 0; i < img.Width; i++) 
     { 
      string rl = sr.ReadLine(); 
      for (int j = 0; j < img.Height; j++) 
      { 
       img.SetPixel(i, j, Color.FromArgb(Int32.Parse(rl))); 
      } 
     } 
     pictureBox1.Image = img; 

mais à partir de ce fichier bmp,

Je reçois cette sortie:

ce que quelqu'un sait comment résoudre ce problème?

merci d'avance.

+0

Pouvez-vous donner un exemple comment le faire? –

+0

Oke, merci ça a marché! –

+0

Réécrit comme réponse pour la lisibilité. – Rotem

Répondre

3

Lorsque vous écrivez les pixels, vous écrivez chacun sur une ligne distincte. Cependant, lors de la lecture, vous lisez une seule ligne par colonne, puis vous utilisez la même valeur de couleur pour chaque ligne de la colonne.

à la place, appelez le ReadLine à l'intérieur de la boucle la plus interne.

for (int i = 0; i < img.Width; i++) 
{   
    for (int j = 0; j < img.Height; j++) 
    { 
     string rl = sr.ReadLine(); 
     img.SetPixel(i, j, Color.FromArgb(Int32.Parse(rl))); 
    } 
} 

Inutile d'ajouter, ce format d'image est incroyablement inefficace en termes d'espace, et dans sa mise en œuvre actuelle également en lecture et en écriture des performances. Vous seriez sage de l'utiliser uniquement comme un exercice d'apprentissage.