DrawImage размывает изображение, несмотря на одинаковые размеры источника / места назначения - PullRequest
1 голос
/ 23 мая 2019

Мне нужно скопировать небольшое растровое изображение, сгенерированное мной, в более крупный объект (скажем, в PictureBox), поэтому я использую DrawImage для этого, но дубликат результата получается размытым, как будто GDI + пытается масштабировать изображение, за исключением того, что оба PageUnitsидентично, разрешение DPI одинаково, исходные и конечные прямоугольники имеют одинаковую ширину и высоту.

Если исходная и конечная точки X, Y равны 0,0, DrawImage работает отлично, но если я изменяю конечную точкуПоложение XY относительно чего-либо еще (даже если ширина и высота одинаковы), тогда результат будет размытым.

Я пробовал каждую перегрузку DrawImage, и результаты всегда одинаковы.Если исходная и конечная позиции X, Y не совпадают, изображение будет размытым.

private void DrawStringVerticalStackingV4(string text, Graphics g, SizeF sizeMaxArea, PointF startPoint, Font font, Brush brush, StringFormat sf)
        {
            Bitmap bmp = new Bitmap(100, 10, g);
            Graphics gBmp = Graphics.FromImage(bmp);

            gBmp.PageUnit = g.PageUnit;

            // Some stuff being drawn...

            // Draw the bitmap on the original canvas
            RectangleF destRect = new RectangleF(startPoint.X, startPoint.Y, gBmp.VisibleClipBounds.Width, gBmp.VisibleClipBounds.Height);
            RectangleF srcRect = new RectangleF(0, 0, gBmp.VisibleClipBounds.Width, gBmp.VisibleClipBounds.Height);

            g.DrawImage(bmp, destRect, srcRect, g.PageUnit);

            // Housekeeping
         }

Если destRect и srcRect не имеют одинаковые X и Y, результат будет слегка искажен, как если бы GDI + пыталсямасштабировать изображение.

1 Ответ

2 голосов
/ 27 мая 2019

Поработав с этим, Ханс Пассант был прав.Установка Graphics.InterpolationMode в NearestNeighbour работала идеально.

Эта проблема возникает, только если ваш PageUnit - это что-то еще, кроме пикселей.Мой маленький мозг считает это логической ошибкой, потому что и исходный, и целевой прямоугольники имели одинаковую ширину и высоту.Единственное, что отличалось, это места назначения X и Y.Никаких искажений не должно быть.

Большое спасибо за помощь!

...