2016-11-29 3 views
0

Я пытаюсь добавить два изображения водяных знаков на изображениях, один в нижнем левом углу и в нижней правой части изображения, независимо от размеров изображения. Ниже мой метод:Размер шрифта для текста с водяным значком с одинаковыми размерами, но с разными значениями dpi

public void AddWaterMark(string leftSideText, string rightSideText, string imagePath) 
{ 
    string firstText = leftSideText; 
    string secondText = rightSideText; 

    Bitmap bitmap = (Bitmap)Image.FromFile(imagePath);//load the image file 

    PointF firstLocation = new PointF((float)(bitmap.Width * 0.035), bitmap.Height - (float)(bitmap.Height * 0.06)); 
    PointF secondLocation = new PointF(((float)((bitmap.Width/2) + ((bitmap.Width/2) * 0.6))), bitmap.Height - (float)(bitmap.Height * 0.055)); 

    int opacity = 155, baseFontSize = 50; 
    int leftTextSize = 0, rightTextSize = 0; 
    leftTextSize = (bitmap.Width * baseFontSize)/1920; 
    rightTextSize = leftTextSize - 5; 
    using (Graphics graphics = Graphics.FromImage(bitmap)) 
    { 
     Font arialFontLeft = new Font(FontFamily.GenericSerif, leftTextSize); 
     Font arialFontRight = new Font(FontFamily.GenericSerif, rightTextSize); 
     graphics.DrawString(firstText, arialFontLeft, new SolidBrush(Color.FromArgb(opacity, Color.White)), firstLocation); 
     graphics.DrawString(secondText, arialFontRight, new SolidBrush(Color.FromArgb(opacity, Color.White)), secondLocation); 
    } 
    string fileLocation = HttpContext.Current.Server.MapPath("~/Images/Albums/") + Path.GetFileNameWithoutExtension(imagePath) + "_watermarked" + Path.GetExtension(imagePath); 
    bitmap.Save(fileLocation);//save the image file 
    bitmap.Dispose(); 
    if (File.Exists(imagePath)) 
    { 
     File.Delete(imagePath); 
     File.Move(fileLocation, fileLocation.Replace("_watermarked", string.Empty)); 
    } 
} 

Проблемы Я облицовка с установкой font size текста метки воды должным образом. Допустим, есть два изображения с размерами 1600 x 900 пикселей, а первое изображение имеет dpi из 72, а на втором изображении dpi из 240. Вышеуказанный метод отлично работает для изображения с 72 dpi, но для изображения с 240dpi текст текста водяных знаков font size становится слишком большим и переливается на изображение. Как правильно рассчитать font size с изображениями разных dpi, но имеет такие же размеры?

+0

Значит, вы хотите, чтобы шрифт был меньше для больших значений DPI? (Размер шрифта в пикселях, а не зависимый от DPI) – grek40

ответ

1

Этот простой трюк должен работать:

Перед нанесения текста установите dpi изображение. После с текстом сброс к предыдущим значениям.

float dpiXNew = 123f; 
float dpiYNew = 123f; 

float dpiXOld = bmp.HorizontalResolution; 
float dpiYOld = bmp.VerticalResolution; 

bmp.SetResolution(dpiXNew, dpiYNew); 

using (Graphics g = Graphics.FromImage(bmp)) 
{ 
    TextRenderer.DrawText(g, "yourText", ....) 
    ... 
} 

bmp.SetResolution(dpiXOld, dpiYOld);