Я немного масштабирую изображение с помощью GDI + (C #), и заметили проблему, при которой изображение, которое я масштабирую, обрезается по левому и верхнему краям.
Чтобы воспроизвести это, создайте новый проект формы, сохраните это изображение в папку 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;
И, к сожалению, это не повлияло на рендеринг. Край все еще был отрезан.