Графика Graphics.DrawImage неправильно масштабируется на большом изображении - PullRequest
4 голосов
/ 18 мая 2009

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

Исходное изображение всегда имеет размер 1024 x 768, так как код до этого берет изображение и изменяет его размер (создает новый файл на основе оригинала).

Логотип правильно применяется к некоторым имеющимся у меня изображениям размером 2288 x 1712. Если я использую изображение 3264 x 2448, то логотип добавляется в правильных координатах начала, но переносится по осям x и y. *

Логотип должен иметь зазор 10 сторон между сторонами. 2 буквы в логотипе, которые вы видите, также намного больше, чем логотип исходного изображения.

alt text

Если я возьму изображение, которое выполняет неправильное поведение (3264 x 2448), изменит его на 2288 x 1712, а затем запусту код, оно выдаст правильный результат!

Я не понимаю, потому что переменная sourceImg всегда имеет версию 1024 x 768, поэтому почему изменение размера исходного изображения должно иметь значение?

Image sourceImg = Image.FromFile(Path.Combine(filepath,filename));
Image logo = Image.FromFile(watermark);

Graphics g = Graphics.FromImage(sourceImg);
g.DrawImage(
   logo,
   sourceImg.Width - horizontalPosition - logo.Width,
   sourceImg.Height - verticalPosition - logo.Height
);
g.Dispose();
logo.Dispose();

sourceImg.Save(Path.Combine(filepath, filename));
sourceImg.Dispose();

1 Ответ

9 голосов
/ 18 мая 2009

Перегрузка DrawImage, которую вы используете, принимает значения PPI изображений для расчета размера. Поскольку значение PPI логотипа ниже значения PPI изображения, логотип масштабируется так, чтобы его относительный физический размер (в дюймах вместо пикселей) был одинаковым.

Используйте перегрузку, где вы указываете размер в пикселях:

g.DrawImage(
   logo,
   sourceImg.Width - horizontalPosition - logo.Width,
   sourceImg.Height - verticalPosition - logo.Height,
   logo.Width,
   logo.Height
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...