C# 使用picturebox作为画布并绘制文本
我想使用PictureBox作为画布,在其上绘制一些文本并保存 我写了这段代码,但我不确定我是否用正确的方法:C# 使用picturebox作为画布并绘制文本,c#,winforms,C#,Winforms,我想使用PictureBox作为画布,在其上绘制一些文本并保存 我写了这段代码,但我不确定我是否用正确的方法: Bitmap b = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics g = Graphics.FromImage(b); g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, picture
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;
这段代码运行得很好,但是当我想更改图像的背景色时,我必须重新绘制文本
有没有一种方法可以在不重新绘制文本的情况下更改背景色?编写绘制程序非常有趣,但您需要提前计划所有或大部分所需的功能 到目前为止,您已经有了这些:
- 你可以改变的背景
- 通过在图像上绘制文本来修改图像的一种方法
- 需要将其全部保存到一个文件中
- 除了文本以外的其他工具,如线条、矩形等
- 颜色和笔宽的选择
- 撤消一个或多个步骤的方法
- 一种帮助使用鼠标绘制和定位的方法
- 其他类型的背景,如画布或pergament纸
- 具有一定水平的绘画能力
- 重做功能(*)
- 旋转和缩放(***)
- 级别(*****)
*
)或更难(***
),但是如果你决定太晚修补它们,所有事情都会变得困难
一定要阅读(从“实际”开始)关于图片框的内容,这些内容解释了它是绘画程序的理想选择
您的原始代码和问题存在以下问题:
- 你似乎认为重复任何事情,比如重画文本是错误的。事实并非如此。Windows一直在重画大量的东西
- 您混合了两项任务,这两项任务实际上应该是分开的
- 您尚未对任何内容进行参数化,最明显的是,文本的绘图应使用多个变量:
- 字体
- 刷子
- 位置
- 文本本身
一旦你画出直线或矩形,同样的情况也会发生
以下是如何正确操作的提示:
- 使用
Picturebox
的BackgroundColor
和/或BackgroundImage
动态更改背景
- 收集所有东西,在
列表中绘制
- 通过将其绘制到Picturebox的
图像中来组合所有图形
- 使用
Paint
事件在移动鼠标时绘制支持对象,如临时矩形或线。在MouseUp
上,将其添加到列表中
最后,让我们修复您的代码..:
使用如下函数设置backgound:
void setBackground(Color col, string paperFile)
{
if (paperFile == "") pictureBox1.BackColor = col;
else pictureBox1.BackgroundImage = Image.FromFile(paperFile);
}
您可以这样称呼它:setBackground(Color.White,”)代码>
要将一段文本绘制到图片盒的图像,请首先确保您有:
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);
}
}
如果您想自己绘制控件的全部内容,请不要使用PictureBox
。创建一个。出于好奇,为什么要使用图片框?设置PB的背景色,然后在Paint()事件中绘制字符串…@Jonathon Reinhart问题不是创建控件@Icemanind,那么我应该如何做?我想创建一个图像,在其上绘制一些文本并在picturebox上显示,然后更改图像的背景色并保存它