Pergunta

Ei, estou mexendo em converter imagens em ascii. Para isso, carrego a imagem, uso getpixel () em cada pixel e insiro um caractere com essa cor em uma caixa de texto RichText.

        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 retorna a cor correta, mas o texto acaba preto. Se eu mudar

isto

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

para isso

richTextBox1.SelectionColor = Color.Red;

Funciona bem.

Por que não estou recebendo as cores certas?

(Eu sei que não faz as novas linhas corretamente, mas pensei em chegar ao fundo deste problema primeiro.)

Obrigado

Foi útil?

Solução

Seu problema está sendo causado pelo uso de += para definir o valor do texto. O uso de += está fazendo com que sua formatação seja perdida, redefinindo o valor do texto e atribuindo um novo valor de string.

Você precisa alterar seu código para usar append ().

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

De msdn:

Você pode usar esse método para adicionar texto ao texto existente no controle, em vez de usar o operador de concatenação (+) para concatenar o texto na propriedade de texto.

Outras dicas

Bem, esta seção parece suspeita para mim:

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

            richTextBox1.Text += "\n";
        }

       x++; 

Portanto, se x for>- largura-1, você define x para 0 e depois o incrementa para o lado de 1 fora do condicional. Pensaria que isso não aumentaria se você o definisse para 0.


Editar:E ao pensar um pouco mais sobre isso, por que não itera sobre a largura e a altura nos loops aninhados e simplifica um pouco as coisas. Algo como:

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;
}

Porque você está dirigindo essa coisa do tamanho da imagem, certo? A posição no RTB depende de onde você está no bitmap.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top