Функция DrawImage () над WinForms не работает правильно - PullRequest
2 голосов
/ 19 июля 2011

Я создал битовую карту шириной 1 пиксель и высотой 256 пикселей, когда я пытаюсь нарисовать эту битовую карту шириной 2 пикселя, используя:

public void DrawImage(Image image,RectangleF rect)

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

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics gr = e.Graphics;

    Bitmap bitmap = new Bitmap(1, 256);
    for (int y = 0; y < 256; y++)
    {
        bitmap.SetPixel(0, y, Color.Red);
    }

    RectangleF rectf = new RectangleF();
    for (int x = 0; x < 500; x++)
    {
        float factor = 2;
        rectf.X = x*factor;
        rectf.Y = 0;
        rectf.Width = fact;
        rectf.Height = 500;
        // should draw bitmap as 2 pixels wide but draws it with white slim stripes in between each bitmap colomn
        gr.DrawImage(bitmap, rectf);
    }           
}

Ответы [ 3 ]

2 голосов
/ 19 июля 2011

Это побочный эффект Graphics.InterpolationMode, при масштабировании растрового изображения возникают артефакты, когда у него заканчиваются пиксели на краю растрового изображения. И очень много пикселей заканчивается растровым изображением шириной всего в один пиксель. Вы можете получить лучшие результаты, установив его в NearestNeighbor и установив PixelOffsetMode в None. Это все еще производит артефакты, хотя некоторая внутренняя ошибка округления по внешности этого. Не уверен, мне пришлось угадывать значение «факта».

Избегайте масштабирования небольших растровых изображений.

1 голос
/ 19 июля 2011
for (int x = 0; x < 500; x++)
{
    float factor = 2;
    rectf.X = x*factor;
    rectf.Y = 0;
    rectf.Width = fact;
    rectf.Height = 500;
    // should draw bitmap as 2 pixels wide
    // but draws it with white slim stripes in between
    // each bitmap colomn
    gr.DrawImage(bitmap, rectf);
}

это твой фрагмент. и вы настаиваете, что should draw bitmap as 2 pixels wide. извините, но это так неправильно. Я объясню почему. давайте посмотрим, как работает этот цикл.

  • x=0

  • Вы устанавливаете верхнюю левую координату х на ноль. rectf.X = x*factor;

  • gr.DrawImage (точечный рисунок, rectf); Вы рисуете растровое изображение шириной 1 пиксель в прямоугольнике, начиная с координаты х, равной 0.

  • цикл заканчивается, х становится 1.

  • координата левого верхнего x теперь равна 2.

  • рисование растрового изображения шириной 1 пиксель в прямоугольнике, начиная с координата x, равная 2. (как вы видите, без растрового изображения @ x = 1)

Должен ли я продолжать или ясно, почему появляются белые полосы и откуда?

чтобы исправить это используйте этот фрагмент

for (int x = 0; x < 500; x++)
{
    float factor = 2;
    rectf.X = x * factor; // x coord loops only through even numbers, thus there are white stripes
    rectf.Y = 0;
    rectf.Width = factor;
    rectf.Height = 500;
    // should draw bitmap as 2 pixels wide
    // but draws it with white slim stripes in between
    // each bitmap colomn
    gr.DrawImage(bitmap, rectf);
    rectf.X = x * factor + 1; // now x coord also loops through odd numbers, and combined with even coords there will be no white stripes.
    gr.DrawImage(bitmap, rectf);    
}

P.S. Чего ты пытаешься достичь? А слышали ли вы о Graphics.FillRectangle () метод?

0 голосов
/ 19 июля 2011

bitmap.SetPixel (1, y, Color.Red) должен это сделать, а rectf.X не должен расширять rectf.Width.

...