2015-11-04 5 views
1

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

Текст на картинке выглядит довольно размытым.

Сниппет я использую, чтобы сделать это следующим образом:

static void ModifyImage() 
{ 
    Image origImage; 
    if (File.Exists(path)) 
    { 
     using (Stream s = new FileStream(path, FileMode.Open, FileAccess.Read)) 
     { 
      origImage = Image.FromStream(s); 
     } 

     using (Image newImage = new Bitmap(path)) 
     { 
      // Get the image's original width and height 
      int originalWidth = origImage.Width; 
      int originalHeight = origImage.Height; 

      // To preserve the aspect ratio 
      float ratio = Math.Min((float)originalWidth, (float)originalHeight); 

      Graphics graphics = Graphics.FromImage(newImage); 
      graphics.SmoothingMode = SmoothingMode.HighQuality; 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 

      string strSoftwareVersion = "Version " + StrVersion; 

      var oVersionFont = new Font("Arial", 15f, FontStyle.Bold); 
      SizeF strSize = graphics.MeasureString(strSoftwareVersion, oVersionFont); 

      float mX = (float)((originalWidth * 0.85) - 5.0); 
      float mY = (float)((originalHeight * 0.85) - 5.0); 
      float mWidth = (float) (strSize.Width + 5.0); 
      float mHeight = (float)(strSize.Height + 10.0); 

      /* 
      * Alternate I tried. 
      */ 
      //GraphicsPath blackfont = new GraphicsPath(); 
      //SolidBrush brsh = new SolidBrush(Color.White); 
      //blackfont.AddString("TEST APP", oVersionFont.FontFamily, (int)FontStyle.Bold, 15, new Point((int)(originalWidth * 0.85), (int)(originalHeight * 0.85)), StringFormat.GenericDefault); 
      //graphics.FillPath(brsh, blackfont); 

      /* 
      *Software Version String 
      */ 
      graphics.DrawString("Version " + StrVersion, new Font("Arial", 15f, FontStyle.Bold), Brushes.White, (int)(originalWidth * 0.85), (int)(originalHeight * 0.85)); 

      /* 
      * Save processed image 
      */ 
      newImage.Save(newPath, ImageFormat.Jpeg); 
     } 
     origImage.Dispose(); 
    } 
} 

enter image description here
Как видно из изображения, размытость текста и прилегающих районов являются весьма заметным. Я вполне уверен, что это связано с проблемой Aliasing или TextRendering с альфа-уровнями, но просто не в состоянии указать точную проблему.

+1

Можете ли вы опубликовать пример результата? Вы пытались отключить сглаживание? – TaW

+0

Если вы хотите манипулировать изображениями, я бы порекомендовал вам использовать Image imagemagick (http://www.imagemagick.org/script/index.php) –

+0

@TaW: Да, я попробовал сгладить его –

ответ

1

Текст выглядит хорошо для меня.

Чтобы сделать его более хрустящим, вы можете отключить все сглаживание.

«Прилегающие районы», очевидно, показывают некоторые jpeg артефакты.

Хороший текст и jpeg не сочетаются хорошо.

Либо установите jpeg quality settings по умолчанию (около 75%), либо за png!

Обратите внимание, что 90-95% качества, в то время как значительно улучшая качество текста также значительно увеличивает размер и собирается для png также может сэкономить пространство в дополнение к тому, без потерь ..

+0

Да, он увеличивает размер изображения. И размер не является проблемой для моего требования. Еще раз спасибо за ваше решение –

0

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

«текст» - это экземпляр System.Windows.Media.FormattedText.

+0

с помощью кодера png, очевидно, будет выглядеть лучше, поэтому это вряд ли ответит на вопрос, который явно задает вопрос о GDI – TaW

Смежные вопросы