我想将PictureBox用作画布并在其上绘制一些文本并保存。
我写了这段代码,但我不确定我是否正确地这样做:
Bitmap b = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(b);
g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height)); // i used this code to make the background color white
g.DrawString("some text", new Font("Times New Roman", 20), new SolidBrush(Color.Red), new PointF(10, 10));
pictureBox1.Image = b;
此代码效果很好但是当我想要更改图像的背景颜色时,我必须重新绘制文本。
有没有办法在不重新绘制文本的情况下更改背景颜色?
答案 0 :(得分:2)
编写Paint程序非常有趣,但您需要提前计划所需的全部或大部分功能。
到目前为止,你有这些:
以下是您需要的一些内容:
以下是一些很好的事情:
有些事情比其他事情更难(*
)或更难(***
),但是当你决定太晚修补时,所有会变得更难。
请阅读关于PictureBoxes
的{{3}}(从'实际'开始),这解释了它是如何成为Paint程序的理想选择。
您的原始代码和问题存在以下问题:
你没有参数化,最值得注意的是文本的绘制应该使用几个变量:
绘制直线或矩形后也是如此。
以下是如何做到正确的提示:
使用BackgroundColor
和/或BackgroundImage
的{{1}}动态更改背景!
收集要在Picturebox
将所有图纸绘制到中,将其合并到图片框的List<someDrawActionclass>
使用Image
事件在移动鼠标时绘制临时矩形或线条等支持内容。在Paint
上,您将其添加到列表中..
所以,到最后,让我们修复你的代码......:
您可以使用以下函数设置背景:
MouseUp
您可以这样称呼它:void setBackground(Color col, string paperFile)
{
if (paperFile == "") pictureBox1.BackColor = col;
else pictureBox1.BackgroundImage = Image.FromFile(paperFile);
}
要将一段文字绘制到 setBackground(Color.White, "");
的{{1}},请先确保您有一个:
Image
现在你可以编写一个写文本的函数了。你真的不应该硬编码任何设置,更不用说文本了!这只是一个快速而又非常肮脏的例子......:
PictureBox
请参阅this post和here,了解如何创建一个drawAction类来存储绘图所构成的所有内容......!
最后一点是如何保存void newCanvas()
{
Bitmap bmp = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
pictureBox1.Image = bmp;
}
的所有图层:
void drawText()
{
using (Font font = new Font("Arial", 24f))
using (Graphics G = Graphics.FromImage(pictureBox1.Image))
{
// no anti-aliasing, please
G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;
G.DrawString("Hello World", font, Brushes.Orange, 123f, 234f);
}
pictureBox1.Invalidate();
}