以编程方式向图像添加文本显得模糊

时间:2015-11-04 07:14:47

标签: c# winforms gdi

我尝试以编程方式向图像添加一些文本,然后保存它。但最终结果有点不令人信服。

图像上的文字看起来非常模糊。

我用来渲染的片段如下:

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
从图像中可以看出,文本和周围区域的模糊性非常突出。我非常确定这是由于alpha级别的Aliasing或TextRendering问题,但却无法指出确切的问题。

2 个答案:

答案 0 :(得分:1)

该文对我来说很好。

为了使其更加清晰,您可以关闭所有抗锯齿功能。

周边地区'显然会显示一些 jpeg工件

好的文字和jpeg不能很好地结合在一起。

从默认值(约75%)调高jpeg quality settings或者转到png

请注意,90-95%的质量,同时大大提高文本质量也大大扩大了尺寸,png的使用可能会为您节省空间,而且无法实现无损。

答案 1 :(得分:0)

我遇到了类似的问题,因为当绘制到图像上时,文本被混淆得很厉害。这是我的解决方案,可以产生合理的文本质量。

“text”是System.Windows.Media.FormattedText实例。

BitmapFrame originalImageSource = BitmapFrame.Create(new Uri(file.FullName), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
var visual = new DrawingVisual();

using(DrawingContext drawingContext = visual.RenderOpen()) {
    drawingContext.DrawImage(originalImageSource, new Rect(0, 0, originalImageSource.PixelWidth, originalImageSource.PixelHeight));
    drawingContext.DrawText(text, topRight);
}

var renderTargetBitmap = new RenderTargetBitmap(originalImageSource.PixelWidth,
originalImageSource.PixelHeight,
originalImageSource.DpiX, originalImageSource.DpiY,
PixelFormats.Pbgra32);

renderTargetBitmap.Render(visual);

BitmapFrame bitmapFrame = BitmapFrame.Create(renderTargetBitmap);
BitmapEncoder encoder = new PngBitmapEncoder();

encoder.Frames.Add(bitmapFrame);
encoder.Save(stream);