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

时间:2015-06-01 22:37:47

标签: 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, 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;

此代码效果很好但是当我想要更改图像的背景颜色时,我必须重新绘制文本。

有没有办法在不重新绘制文本的情况下更改背景颜色?

1 个答案:

答案 0 :(得分:2)

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

到目前为止,你有这些:

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

以下是您需要的一些内容:

  • 除文字之外的其他工具,如线条,矩形等。
  • 选择宽度为的颜色和笔
  • 撤消一个或多个步骤的方法

以下是一些很好的事情:

  • 一种帮助用鼠标绘图和定位的方法
  • 其他类型的背景,如帆布或普通纸
  • 以一定程度的透明度绘制的能力
  • 重做功能(*)
  • 旋转和缩放(***)
  • 级别(*****)

有些事情比其他事情更难(*)或更难(***),但是当你决定太晚修补时,所有会变得更难。

请阅读关于PictureBoxes的{​​{3}}(从'实际'开始),这解释了它是如何成为Paint程序的理想选择。

您的原始代码和问题存在以下问题:

  • 你似乎认为重复任何事情,比如重新绘制文字是错误的。它不是。 Windows一直在重绘大量内容..
  • 你混合了两个真正应该分开的任务。
  • 你没有参数化,最值得注意的是文本的绘制应该使用几个变量:

    • 字体
    • 位置
    • 文本本身

绘制直线或矩形后也是如此。

以下是如何做到正确的提示:

  • 使用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 posthere,了解如何创建一个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();
}