C # Проблема с getPixel и соответствующей настройкой цвета текста RTF - PullRequest
1 голос
/ 16 апреля 2010

Heyo, я возиться с преобразованием изображений в ASCII. Для этого я загружаю изображение, использую getPixel () для каждого пикселя, затем вставляю символ с этим цветом в richTextBox.

        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 возвращает правильный цвет, но текст в итоге становится черным. Если я изменю

это

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

к этому

richTextBox1.SelectionColor = Color.Red;

Работает нормально.

Почему я не получаю правильные цвета?

(я знаю, что новые строки не работают должным образом, но я подумал, что сначала доберусь до сути этой проблемы.)

Спасибо

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

Ваша проблема вызвана использованием + = для установки значения текста. Использование + = приводит к потере вашего форматирования, если заново установить значение «Текст» и назначить новое строковое значение.

Вам нужно изменить код, чтобы использовать вместо него Append ().

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

От MSDN:

Этот метод можно использовать для добавления текста к существующему тексту в элементе управления вместо использования оператора конкатенации (+) для объединения текста со свойством Text.

1 голос
/ 16 апреля 2010

Ну, этот раздел мне кажется подозрительным:

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

            richTextBox1.Text += "\n";
        }

       x++; 

Так что, если x равен> - width-1, вы устанавливаете x в 0, а затем увеличиваете его до 1 вне условного выражения. Можно было бы подумать, что он не будет увеличиваться, если вы установите его на 0.


Edit: Подумав об этом еще немного, почему бы не выполнить итерацию по ширине и высоте во вложенных циклах и немного упростить вещи. Что-то вроде:

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

потому что вы вытаскиваете эту вещь из размера изображения, верно? Положение в RTB зависит от того, где вы находитесь в битовой карте.

...