10

我的 Windows 窗体应用程序上有一个PictureBox

我在其中加载了一张图片,并Paint在我的代码中启用了该事件。它绘制一个矩形。

像这样:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Graphics gr = e.Graphics;
    Pen p = new Pen(Color.Red);
    p.Width = 5.0f;
    gr.DrawRectangle(p, 1, 2, 30, 40);
}

然后我点击“保存”按钮:

private void button2_Click(object sender, EventArgs e)
{
    pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
}

但是保存的文件从不包含我绘制的矩形。

有人有什么主意吗?

4

5 回答 5

6

谢谢。你的回答都有帮助。这有效

        private void button1_Click(object sender, EventArgs e)
    {
        pictureBox1.ImageLocation=@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000.jpg" ;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {

    }

    private void button3_Click(object sender, EventArgs e)
    {
        Bitmap bmp = new Bitmap(pictureBox1.Image);
        Graphics gr = Graphics.FromImage(bmp);
        Pen p = new Pen(Color.Red);
        p.Width = 5.0f;
        gr.DrawRectangle(p, 1, 2, 30, 40);
        pictureBox1.Image = bmp;
    }
于 2009-06-30T13:21:56.823 回答
5

您可能不应该直接在 PictureBox 上绘图。

您需要改用位图。尝试将位图放在 PictureBox.Image 中,然后调用 Save()。

检查以获取更多详细信息

于 2009-06-30T12:57:32.753 回答
4

这是我对各种文件类型的额外支持的解决方案:

    public void ExportToBmp(string path)
    {
        using(var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height))
        {
        pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle);
        ImageFormat imageFormat = null;

        var extension = Path.GetExtension(path);
        switch (extension)
        {
            case ".bmp":
                imageFormat = ImageFormat.Bmp;
                break;
            case ".png":
                imageFormat = ImageFormat.Png;
                break;
            case ".jpeg":
            case ".jpg":
                imageFormat = ImageFormat.Jpeg;
                break;
            case ".gif":
                imageFormat = ImageFormat.Gif;
                break;
            default:
                throw new NotSupportedException("File extension is not supported");
        }

        bitmap.Save(path, imageFormat);
        }
    }
于 2012-06-08T08:59:55.630 回答
3

这是一个小例子,它为我澄清了一些事情(我也为此苦苦挣扎)。

pBox 是 Form1 上的 PictureBox,使其至少为 50x50

appPath 派生自 System.Reflection 但使用您喜欢的任何路径

有两个按钮,一个用于绘制,一个用于保存,它们的点击事件在下面的代码中。

我学到的东西:

(1)“pBox.Image =”除了初始化 pBox 图像之外什么都不做,它不一定是我发现使用的每个示例的文件名(保存到同一个文件时遇到问题,因为它被共享锁定)。此外,如果您的目标是查看整个控件表面上的内容,您可能希望在初始化时将大小设置为您需要的大小。我在这个例子中使用了 pBox 的大小,但通常我使用位图大小(因为我通常从一个真实的图片文件开始)。

(2) 我总是遇到问题,要么看到我的绘图显示在控件上,要么看到我的更改保存在输出文件中(或两者兼而有之)。在我之前的尝试中,我会在控件和位图上复制绘图。当然这不是必需的,但编辑后的位图确实需要重新加载到 control.image 中......这就是我错过的这个难题的一部分。

(A) 从 control.image 创建位图并在位图上绘制

(B) 将位图加载到 control.Image 中(这样可以看到绘制引起的变化)

(C) 保存控件。图像

(2-选项)您有一个全局(或传递的)位图(可能来自真实文件)

(A) 在位图上绘制

(B) 将位图加载到 control.Image 中(这样你就可以看到变化了)

(C) 保存位图

    public Form1()
    {
        InitializeComponent();
        pBox.Image = new Bitmap(pBox.Width, pBox.Height);  
    }

    private void DrawStuff1_Click(object sender, EventArgs e)
    {
        Bitmap bmp = new Bitmap(pBox.Image);  
        Graphics g = Graphics.FromImage(bmp);

        g.FillRectangle(Brushes.Red, 5, 5, 25, 25); //hard-coded size to reduce clutter

        pBox.Image = bmp;  //this makes your changes visible
    }

    private void Save_Click(object sender, EventArgs e)
    {
        pBox.Image.Save(appPath + "SavedImage.bmp");
    }
于 2012-11-17T17:57:35.617 回答
1

您需要绘制图片的图像,而不是 Paint 事件上的 Graphics 控件。

编辑:

using( Graphics g = Graphics.FromImage( pictureBox1.Image ) ) {
    // there you will be do, what you do in Paint event
}

// ... somewhere else ...
pictureBox1.Save( _required_parameters_ );
于 2009-06-30T12:55:26.643 回答