使用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;

这段代码工作得很好,但是当我想改变图像的背景颜色时,我必须重新绘制文本。

有没有办法改变背景颜色,而不必重新绘制文本?

使用picturebox作为画布并绘制文本

写一个Paint程序是很有趣的,但是你需要提前计划好你想要的全部或大部分功能。

到目前为止,你有这些:

  • 可以更改的背景
  • 通过在图像上绘制文本来修改图像的方法
  • 需要全部保存到文件

这里还有一些你需要的东西:

  • 文字以外的工具,如线条、矩形等。
  • 宽度
  • 的颜色和笔的选择
  • 撤销一个或多个步骤的方法

以下是一些值得拥有的东西:

  • 一种帮助用鼠标绘图和定位的方法
  • 其他类型的背景,如画布或纸张
  • 具有一定透明度的绘图能力
  • 重做功能(*)
  • 旋转和缩放(***)
  • 水平 (*****)

有些事情比其他事情更难(*)或更难(***),但是所有在你决定打补丁的时候都变得很难。

一定要阅读这篇关于PictureBoxes的文章(从"实际上"开始),它解释了它是如何成为一个Paint程序的理想选择。

你的原始代码和你的问题有这些问题:

    你似乎认为重复任何事情都是错误的,比如重新绘制文本。事实并非如此。Windows一直在重画大量的东西…
  • 你把两个应该分开的任务混在一起了。
  • 你没有参数化任何东西,最值得注意的是文本的绘制应该使用几个变量:

      <
    • 字体/gh>
    • 文本本身

当你画直线或矩形时也是如此。

所以这里有一些如何正确使用的提示:

  • 使用BackgroundColor和/或PictureboxBackgroundImage来动态改变背景!

  • 收集所有的东西画在一个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, "");

要在 PictureBoxImage中绘制一段文本,首先确保您有一个:

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);
    }
}