使用picturebox作为画布并绘制文本
本文关键字:绘制 文本 picturebox 使用 | 更新日期: 2023-09-27 17:52:36
我想使用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;
这段代码工作得很好,但是当我想改变图像的背景颜色时,我必须重新绘制文本。
有没有办法改变背景颜色,而不必重新绘制文本?
写一个Paint程序是很有趣的,但是你需要提前计划好你想要的全部或大部分功能。
到目前为止,你有这些:
- 可以更改的背景
- 通过在图像上绘制文本来修改图像的方法
- 需要全部保存到文件
这里还有一些你需要的东西:
- 文字以外的工具,如线条、矩形等。
- 宽度 的颜色和笔的选择
- 撤销一个或多个步骤的方法
以下是一些值得拥有的东西:
- 一种帮助用鼠标绘图和定位的方法
- 其他类型的背景,如画布或纸张
- 具有一定透明度的绘图能力
- 重做功能(*)
- 旋转和缩放(***)
- 水平 (*****)
有些事情比其他事情更难(*
)或更难(***
),但是所有在你决定打补丁的时候都变得很难。
一定要阅读这篇关于PictureBoxes
的文章(从"实际上"开始),它解释了它是如何成为一个Paint程序的理想选择。
你的原始代码和你的问题有这些问题:
- 你似乎认为重复任何事情都是错误的,比如重新绘制文本。事实并非如此。Windows一直在重画大量的东西…
- 你把两个应该分开的任务混在一起了。
你没有参数化任何东西,最值得注意的是文本的绘制应该使用几个变量:
- <
- 字体/gh>
- 文本本身
当你画直线或矩形时也是如此。
所以这里有一些如何正确使用的提示:
使用
BackgroundColor
和/或Picturebox
的BackgroundImage
来动态改变背景!收集所有的东西画在一个
List<someDrawActionclass>
通过将其绘制到 Picturebox的
Image
来合并所有绘图使用
Paint
事件在移动鼠标时绘制支持的东西,如临时矩形或线条。在MouseUp
你把它添加到列表…
那么,到最后,让我们来修复你的代码…:
使用如下函数设置背景:
void setBackground(Color col, string paperFile)
{
if (paperFile == "") pictureBox1.BackColor = col;
else pictureBox1.BackgroundImage = Image.FromFile(paperFile);
}
你可以这样命名:setBackground(Color.White, "");
要在 PictureBox
的Image
中绘制一段文本,首先确保您有一个:
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();
}
查看这里和这里的一些备注如何创建一个drawAction类来存储所有的东西,你的绘图是由…!
最后一点是如何保存PictureBox
的所有图层:
void saveImage(string filename)
{
using (Bitmap bmp = new Bitmap(pictureBox1.ClientSize.Width,
pictureBox1.ClientSize.Height))
{
pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);
bmp.Save("yourFileName.png", ImageFormat.Png);
}
}