繁体   English   中英

将图片框用作画布并绘制文本

[英]Use picturebox as a canvas and draw text

我想将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一直都在重绘大量内容。
  • 您混合了两个实际上应该分开的任务。
  • 您没有参数化任何内容,最值得注意的是,文本的绘制应使用几个变量:

    • 字形
    • 位置
    • 文字本身

绘制线条或矩形后,情况同样如此。

因此,这里有一些提示如何做到正确的:

  • 使用PictureboxBackgroundColor和/或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, "");

要将一段文本绘制 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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM