Добавление авторских прав на изображение в C # - странное поведение - PullRequest
0 голосов
/ 19 декабря 2011

Я пытаюсь добавить авторские права на изображение. Если разрешение изображения меньше 4592x2576, оно работает как я хочу. Но во втором случае (в этом случае, если разрешение равно 4592x2576), это добавляет слишком большой размер авторского права.

Смотрите вложения для деталей.

class Program
{
    private static string file5 = "d:\\DSC01305.JPG";
    private static string file6 = "d:\\DSC01427.JPG";

    static void Main(string[] args)
    {
        AddCopyrightWithText(file5);//good
        AddCopyrightWithText(file6);//not good
    }

    private const string CopyrightText = "mysite.com";
    private const int MaxFontSize = 190;
    const int coefficient = 20;

    public static void AddCopyrightWithText(string fileName)
    {
        using (var img = Image.FromFile(fileName))
        {
            using (var gr = Graphics.FromImage(img))
            {
                var color = Color.FromArgb(90, 241, 235, 105);
                int fontSize = img.Width / coefficient;
                if (fontSize > MaxFontSize)
                    fontSize = MaxFontSize;

                var font = new Font("Comic Sans MS", (float)fontSize, FontStyle.Bold);

                var stringFormat = new StringFormat();
                stringFormat.Alignment = StringAlignment.Center;
                stringFormat.LineAlignment = StringAlignment.Center;

                gr.SmoothingMode = SmoothingMode.AntiAlias;
                int y = img.Height - (int)gr.MeasureString(CopyrightText, font, int.MaxValue).Height;
                int x = img.Width / 2;

                gr.DrawString(CopyrightText, font, new SolidBrush(color), new Point(x, y), stringFormat);
            }
            using (var ms = new MemoryStream())
            {
                img.Save(ms, ImageFormat.Jpeg);
                img.Dispose();
                File.Delete(fileName);
                var file = new FileStream(fileName, FileMode.Create, FileAccess.Write);
                ms.Seek(0, SeekOrigin.Begin);
                ms.WriteTo(file);
                file.Close();
                file.Dispose();
            }
        }
    }
}

Во втором случае, если я установлю fontSize = 182 вручную (поскольку в первом случае fontSize равно 182), эффект не будет, результат тот же!

Как мне это исправить?

P.S. Первое и второе вложения показывают желаемый результат, третье и четвертое показывают ошибку. Обратите внимание, что в третьем приложении я изменил размер шрифта вручную с 190 на 182.

Исходное изображение ниже good result

Исходное изображение ниже good result

Исходное изображение ниже bad result

Исходное изображение ниже bad result

1 Ответ

1 голос
/ 19 декабря 2011

Необходимо использовать GraphicsUnit.Pixel

var font = new Font("Comic Sans MS", (float)fontSize, FontStyle.Bold, GraphicsUnit.Pixel);

Причина в том, что конструктор для Font, который не принимает параметр GraphicsUnit, будет использовать GraphicsUnit.Point.

Это относится к информации DPI, которая для некоторых форматов изображения сохраняется в изображении (для других она использует значения по умолчанию из системы). Точки относятся к дюймам, поэтому разные DPI для изображения означают разные размеры в пикселях. Поэтому разные изображения в конечном итоге имеют текст разных размеров. Это было бы замечательно, если бы мы хотели печатать изображения в соответствии с их информацией DPI и иметь одинаковый размер текста в каждой распечатке. Чтобы экранное использование было согласованным, важны именно размеры в пикселях, поэтому мы сделаем это явным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...