Почему GDI + обрезает масштабированные изображения?

Я немного масштабирую изображение с помощью GDI + (C #), и заметили проблему, при которой изображение, которое я масштабирую, обрезается по левому и верхнему краям.

http://zctut.com/cutoff.png

Чтобы воспроизвести это, создайте новый проект формы, сохраните это изображение в папку bin \ debug и добавьте в форму следующий код (и соответствующие события):

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    int scale = 1;
    Image img = Image.FromFile("circle.png");

    private void Form1_Paint(object sender, PaintEventArgs e) {
        //this makes the glitch easier to see
        e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;

        RectangleF srcRect = new RectangleF(0f, 0f, img.Width, img.Height);
        RectangleF destRect = new RectangleF(0f, 0f, img.Width * scale, img.Height * scale);

        e.Graphics.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel);
    }

    private void Form1_Click(object sender, EventArgs e) {
        scale++;
        if (scale > 8) scale = 1;
        Invalidate();
    }
}

Как видите, левая и самая верхняя строки пикселей - это обрезается, как будто прямоугольник масштабирования начинается на полпути в пикселе.

Редактировать: Для заметки, я также пробовал использовать преобразование масштабирования вместо использования прямоугольников, как указано выше, и оно отображалось точно так же.

Теперь, с учетом сказанного, я обнаружил обходной путь. Если вы измените объявления прямоугольников в приведенном выше примере следующим образом:

RectangleF srcRect = new RectangleF(-0.5f, -0.5f, img.Width, img.Height);

Чтобы мы исправили «половину пути», изображение будет отображаться правильно.

В принципе, хотя это легко обойти, Я что-то делаю не так, или это нормальное поведение?

Изменить: По совету Андрея Паны я попытался добавить этот код перед вызовом рисования:

e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None;

И, к сожалению, это не повлияло на рендеринг. Край все еще был отрезан.

9
задан Mike Caron 19 December 2010 в 07:35
поделиться