DrawImage слишком маленькое изображение - PullRequest
0 голосов
/ 19 мая 2018

Когда я рисую изображение, используя Graphics.DrawImage, и рисую его больше, чем исходное изображение, оно оказывается слишком маленьким.Это можно видеть на следующем рисунке:
enter image description here

Зеленые линии не должны быть видны и не являются частью изображения.Скорее они рисуются позади изображения, и изображение должно покрывать их.

Как я могу нарисовать изображение с точным правильным размером?

РЕДАКТИРОВАТЬ : я рисую зеленыйчасть с таким же прямоугольником я передаю в вызов DrawImage, с точными размерами того, насколько большим должно быть изображение.Так что в моих значениях нет недостатка (я думаю).

РЕДАКТИРОВАТЬ 2 : я рисую зеленый прямоугольник, используя FillRectangle, поэтому не нужно выполнять вычисления пера.Кроме того, я записал значения, которые я передаю в прямоугольник как для изображения, так и для зеленой заливки, и значения верны.Это просто изображение, которое выключено.Я опубликую код позже, поскольку на данный момент я не за компьютером.

РЕДАКТИРОВАТЬ 3 : этот код я использую для визуализации изображений:

// This is for zooming
public readonly float[] SCALES = { 0.05f, 0.1f, 0.125f, 0.25f, 0.333f, 0.5f, 0.667f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f, 2.5f, 3.0f, 3.5f, 4.0f, 4.5f, 5.0f, 6.0f, 7.0f, 8.0f, 10.0f, 12.0f, 15.0f, 20.0f, 30.0f, 36.0f };
private int scaleIndex = 8;

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    float ScaleFactor = SCALES[scaleIndex];

    e.Graphics.InterpolationMode = ScaleFactor < 1 ? InterpolationMode.Bicubic : InterpolationMode.NearestNeighbor;

    Image im = Properties.Resources.TSprite0;

    for (int y = 0; y < TilesVertical; y++)
    {
        for (int x = 0; x < TilesHorizontal; x++)
        {
            float sx = im.Width * ScaleFactor;
            float sy = im.Height * ScaleFactor;
            Point p = new Point((int)(-scrollPosition.X + sx * x), (int)(-scrollPosition.Y + sy * y));
            Size s = new Size((int)Math.Floor(sx), (int)Math.Floor(sy));

            // The green rectangle in the background should be the same size as the image
            e.Graphics.FillRectangle(Brushes.Lime, new Rectangle(p, s));
            e.Graphics.DrawImage(im, new Rectangle(p, s), 0, 0, 16, 16, GraphicsUnit.Pixel);
        }
    }

    im.Dispose();
}

EDIT 4 : Также обратите внимание, что изображение кажется обрезанным слева и сверху вместо изменения размера.Взгляните на это сравнение исходного изображения, масштабированного в Photoshop, и узнайте, как GDI + его отображает: enter image description here

1 Ответ

0 голосов
/ 19 мая 2018

Проблема возникает при масштабировании до 2x или более.

Похоже, что вся проблема вызвана неправильным значением по умолчанию PixelOffsetMode .

смещением пикселейво время рендеринга вы можете улучшить качество рендеринга за счет скорости рендеринга.

Установка его на

g.PixelOffsetMode = PixelOffsetMode.Half;

делает его исчезающим для меня.

Настройка

g.PixelOffsetMode = PixelOffsetMode.HighQuality;

также работает нормально.

Default, None и HighSpeed вызывают рендеринг изображения немного влево и вверх.

Часто вы также хотите установить InterpolationMode.NearestNeighbor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...