在位图上写文本

我有以下的问题。我想使一些图形在 c # 窗口的形式。 我想读取位图到我的程序,并在它写一些文本在这个位图。最后,我希望这个图片加载到 pictureBox。这是我的问题。我该怎么做?

例如,它必须如何工作:

Bitmap a = new Bitmap(@"path\picture.bmp");
a.makeTransparent();
// ? a.writeText("some text", positionX, positionY);
pictuteBox1.Image = a;

有可能做到吗?

118003 次浏览

You need to use the Graphics class in order to write on the bitmap.

具体来说,是 DrawString方法之一。

Bitmap a = new Bitmap(@"path\picture.bmp");


using(Graphics g = Graphics.FromImage(a))
{
g.DrawString(....); // requires font, brush etc
}


pictuteBox1.Image = a;
var bmp = new Bitmap(@"path\picture.bmp");
using( Graphics g = Graphics.FromImage( bmp ) )
{
g.DrawString( ... );
}


picturebox1.Image = bmp;
Bitmap bmp = new Bitmap("filename.bmp");


RectangleF rectf = new RectangleF(70, 90, 90, 50);


Graphics g = Graphics.FromImage(bmp);


g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.DrawString("yourText", new Font("Tahoma",8), Brushes.Black, rectf);


g.Flush();


image.Image=bmp;

这是一个很老的问题,但是今天我只是为一个应用程序做了这个,发现在其他答案中显示的设置不会产生一个干净的图像(可能是后来添加了新的选项。网上版本)。

假设你想要位图中心的文本,你可以这样做:

// Load the original image
Bitmap bmp = new Bitmap("filename.bmp");


// Create a rectangle for the entire bitmap
RectangleF rectf = new RectangleF(0, 0, bmp.Width, bmp.Height);


// Create graphic object that will draw onto the bitmap
Graphics g = Graphics.FromImage(bmp);


// ------------------------------------------
// Ensure the best possible quality rendering
// ------------------------------------------
// The smoothing mode specifies whether lines, curves, and the edges of filled areas use smoothing (also called antialiasing).
// One exception is that path gradient brushes do not obey the smoothing mode.
// Areas filled using a PathGradientBrush are rendered the same way (aliased) regardless of the SmoothingMode property.
g.SmoothingMode = SmoothingMode.AntiAlias;


// The interpolation mode determines how intermediate values between two endpoints are calculated.
g.InterpolationMode = InterpolationMode.HighQualityBicubic;


// Use this property to specify either higher quality, slower rendering, or lower quality, faster rendering of the contents of this Graphics object.
g.PixelOffsetMode = PixelOffsetMode.HighQuality;


// This one is important
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;


// Create string formatting options (used for alignment)
StringFormat format = new StringFormat()
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};


// Draw the text onto the image
g.DrawString("yourText", new Font("Tahoma",8), Brushes.Black, rectf, format);


// Flush all graphics changes to the bitmap
g.Flush();


// Now save or use the bitmap
image.Image = bmp;

References

如果你想要你的文本 wrap,那么你应该画你的文本在一个 rectangle:

RectangleF rectF1 = new RectangleF(30, 10, 100, 122);
e.Graphics.DrawString(text1, font1, Brushes.Blue, rectF1);

See: https://msdn.microsoft.com/en-us/library/baw6k39s(v=vs.110).aspx