Graphics.DrawImage неожиданно изменяет размер изображения

У меня есть некоторый код, который принимает png, который представляет собой изображение в градациях серого с прозрачностью, и пытается создать новое изображение, имеющее заданный цвет фона (полученный из базы данных), и накладывающее на него исходное изображение, чтобы создать изображение требуемый цвет с бликами и штриховкой. Код запускается в контексте ASP.NET, но я не думаю, что это актуально.

Код отлично работает на моем локальном компьютере, но когда он развернут на нашем сервере UAT, он дает неожиданные результаты. На UAT он создает изображение правильного размера, но затененная / выделенная область, кажется, уменьшилась в каждом измерении на 20%. Таким образом, основное изображение, на которое я смотрю, изначально имеет размер 5x29, а выходное изображение - 5x29, но затененная область - 4x23.2 (24-я строка немного отличается, но в основном это цвет фона, поэтому я предположил, что она выполняет некоторую интерполяцию с изменением размера ).

Мой код, который терпит неудачу, выглядит следующим образом:

private byte[] GetImageData(CacheKey key)
{
    byte[] imageData;
    using (Image image = Image.FromFile(key.FilePath))
    using (Bitmap newImage = new Bitmap(image.Width, image.Height))
    {
        using (Graphics graphic = Graphics.FromImage(newImage))
        {
            using (SolidBrush brush = new SolidBrush(ColorTranslator.FromHtml(key.BackgroundColour)))
            {
                graphic.FillRectangle(brush, 0, 0, image.Width, image.Height);
            }
            graphic.DrawImage(image, 0, 0);

            /*
            The following lines see if there is a transparency mask to create final
             transparency. It does this using GetPixel and SetPixel and just modifying
             the alpha of newImage with the alpha of mask. I don't think this should make a difference but code below anyway.
            */

            Bitmap mask;
            if (TryGetMask(key.FilePath, out mask))
            {
                ApplyMask(newImage, mask);
            }


            using (var memoryStream = new MemoryStream())
            {
                newImage.Save(memoryStream, ImageFormat.Png);
                imageData = memoryStream.ToArray();
            }
        }
    }
    return imageData;
}

private void ApplyMask(Bitmap Bitmap, Bitmap mask)
{
    if (mask.Width != Bitmap.Width || mask.Height != Bitmap.Height)
    {
        throw new ArgumentException("Bitmap sizes do not match");
    }
    for (int y = 0; y < Bitmap.Height; y++)
    {
        for (int x = 0; x < Bitmap.Width; x++)
        {
            Color colour = Bitmap.GetPixel(x, y);
            colour = Color.FromArgb(mask.GetPixel(x, y).A, colour);
            Bitmap.SetPixel(x, y, colour);
        }
    }
}

Вот изображения, которые я получаю (повторил четыре раза, чтобы лучше продемонстрировать проблему). Первый - это правильное изображение, полученное с локального компьютера. Второе - это то, что происходит с моего UAT-сервера, который демонстрирует странную проблему «уменьшения на 20%». Они используются аналогично этому в качестве повторяющегося фона, чтобы вы могли понять, почему эффект так заметен. Они были созданы с белым фоном, чтобы было легче увидеть проблему. У меня есть похожие изображения в других цветах, если кто-то хочет их. :)

В качестве окончательного пояснения используемые изображения должны быть идентичными (UAT был развернут из того, что я проверил в нашем репозитории GIT, и никогда не было более одной версии этих образов, поэтому он не может использовать неправильную версию.

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос