C# 使用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

我想使用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;
这段代码运行得很好,但是当我想更改图像的背景色时,我必须重新绘制文本


有没有一种方法可以在不重新绘制文本的情况下更改背景色?

编写绘制程序非常有趣,但您需要提前计划所有或大部分所需的功能

到目前为止,您已经有了这些:

  • 你可以改变的背景
  • 通过在图像上绘制文本来修改图像的一种方法
  • 需要将其全部保存到一个文件中
以下是您还需要的一些东西:

  • 除了文本以外的其他工具,如线条、矩形等
  • 颜色和笔宽的选择
  • 撤消一个或多个步骤的方法
这里有几样东西是值得拥有的:

  • 一种帮助使用鼠标绘制和定位的方法
  • 其他类型的背景,如画布或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上显示,然后更改图像的背景色并保存它