2010-04-16 5 views
1

Heyo, je suis en train de jouer avec la conversion d'images en images ASCII. Pour cela, je charge l'image, utilise getPixel() sur chaque pixel, puis insère un caractère avec cette couleur dans un richTextBox.C# Problème avec getPixel et réglage de la couleur de texte RTF en conséquence

 Bitmap bmBild = new Bitmap(openFileDialog1.FileName.ToString()); // valid image 

     int x = 0, y = 0; 

     for (int i = 0; i <= (bmBild.Width * bmBild.Height - bmBild.Height); i++) 
     { 
      // Ändra text här 
      richTextBox1.Text += "x"; 
      richTextBox1.Select(i, 1); 

      if (bmBild.GetPixel(x, y).IsKnownColor) 
      { 

       richTextBox1.SelectionColor = bmBild.GetPixel(x, y); 
      } 
      else 
      { 
       richTextBox1.SelectionColor = Color.Red; 
      } 


      if (x >= (bmBild.Width -1)) 
      { 
       x = 0; 
       y++; 

       richTextBox1.Text += "\n"; 
      } 

      x++; 
     } 

GetPixel renvoie la couleur correcte, mais le texte ne finit que noir. Si je change

cette

richTextBox1.SelectionColor = bmBild.GetPixel(x, y); 

à cette

richTextBox1.SelectionColor = Color.Red; 

Il fonctionne très bien. Pourquoi ne reçois-je pas les bonnes couleurs?

(je sais que cela ne fait pas les nouvelles lignes correctement, mais je pensais que je serais aller au fond de cette question d'abord.)

Merci

Répondre

1

Votre problème est provoqué en utilisant + = pour définir la valeur de texte. L'utilisation de + = entraîne la perte de la mise en forme en redéfinissant la valeur Text et en affectant une nouvelle valeur de chaîne.

Vous devez changer votre code pour utiliser Append() à la place.

richTextBox1.Append("x"); 
richTextBox1.Append("\n"); 

De MSDN:

Vous pouvez utiliser cette méthode pour ajouter du texte au texte existant dans le contrôle au lieu d'utiliser l'opérateur de concaténation (+) pour concaténer texte à la propriété Text.

1

Eh bien, cette section semble suspect me :

 if (x >= (bmBild.Width -1)) 
     { 
      x = 0; 
      y++; 

      richTextBox1.Text += "\n"; 
     } 

     x++; 

donc, si x est> - largeur 1, vous définissez x à 0 puis incrémenter à 1 sur le côté conditionnel. Penserait qu'il ne serait pas incrémenter si vous réglez sur 0.


Edit: Et à penser à ce un peu plus, pourquoi ne pas itérer sur la largeur & hauteur dans les boucles imbriquées et simplifiez les choses un peu . Quelque chose comme:

int col = 0; 
int row = 0; 
while (col < bmBild.Height) 
{ 
    row = 0; 
    while (row < bmBild.Width) 
    { 
     // do your stuff in here and keep track of the position in the RTB 
     ++row; 
    } 
    ++col; 
} 

parce que vous conduisez cette chose hors de la taille de l'image, non? La position dans le RTB dépend de l'endroit où vous vous trouvez dans le Bitmap.

Questions connexes