C# 使用重叠控件在PictureBox中保存图像

C# 使用重叠控件在PictureBox中保存图像,c#,winforms,image,picturebox,savefiledialog,C#,Winforms,Image,Picturebox,Savefiledialog,我正在开发一个应用程序,用户可以在其中选择图片框中的图像 之后,他可以右键单击图像并添加一个用户控件,该控件将再次显示图像和一些文本。此用户控件可以添加任意次数 用户还可以根据需要重新定位用户控件 所有这些功能都已经实现,并且运行良好 现在,要求将图像与用户控件一起保存。 上面您可以看到需要保存的完整图像。背面图像是图片框图像和用户控件(带文本的小图像) 当用户单击保存按钮时,图像应作为单个图像保存在其磁盘上 这是在C#中开发的windows应用程序。 我想知道这个功能能否实现。如果是,请引导

我正在开发一个应用程序,用户可以在其中选择图片框中的图像

之后,他可以右键单击图像并添加一个用户控件,该控件将再次显示图像和一些文本。此用户控件可以添加任意次数

用户还可以根据需要重新定位用户控件

所有这些功能都已经实现,并且运行良好

现在,要求将图像与用户控件一起保存。

上面您可以看到需要保存的完整图像。背面图像是图片框图像和用户控件(带文本的小图像)

当用户单击保存按钮时,图像应作为单个图像保存在其磁盘上

这是在C#中开发的windows应用程序。


我想知道这个功能能否实现。如果是,请引导我正确的方向。

如果您创建位图的副本,然后使用Graphics.DrawImage()可以将这些图像绘制到位图上。您需要计算这些控件的位置

请在此处查看DrawImage:

例如:

Bitmap copy = new Bitmap(OriginalBitmap);

Graphics g = Graphics.FromImage(copy);

g.DrawImage(arrowBitmap, new Point(..));

copy.Save(...);

微软已经想到了一个非常简单直接的解决方案,包括以下步骤:

  • 使用
    面板
    代替
    图片盒
    ,使用
    面板
    背景图像
    属性代替
    图片盒
    图像
    属性
注意:通过使用
BackgroundImageLayout
属性,您可以非常轻松地指示
面板
拉伸、居中或缩放图像(我假设默认值为“平铺”在您的情况下不是一个好选项)

  • 将其他用户控件放置在
    面板中,而不是将其放置在更高的Z顺序,而是与上一个
    图片框一起
  • 使用
    控件.DrawToBitmap
    方法,如下所示:

    private void button1_Click(object sender, EventArgs e) {
        var bmp = new Bitmap(this.panel1.Width, this.panel1.Height);
        this.panel1.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size));
        bmp.Save(@"D:\test.png", ImageFormat.Png);
    }
    
这将导致控件开始随图片一起渲染:


此外,如果您的场景允许,您可以简单地将
DrawToBitmap
方法与包含您希望渲染的所有参与者的任何控件一起使用,例如实际的
表单

嘿,它工作得很好。谢谢你的简单回答。只有一件事.png给了我一个GDI+错误,但当我改成.Jpeg时,它成功地保存了。再次感谢。很高兴听到这个消息。图像格式由您选择。。你可以使用Bmp、Jpeg、Gif。。不管什么都适合你。虽然这个答案很完美,但我还有一个问题。其实我并没有提到,用户可以缩小图像也。实现缩放后,保存的图像不完整。有什么解决办法吗?我想我明白。。。你是说一小时前,无论缩放级别如何,你总是能得到一张完整的图片,但没有用户控制。现在,您也可以使用用户控件,但由于视口的原因,图片会被裁剪?请确认这就是你的意思。我会想出一个优雅的解决方案。我得到了Jeroen的解决方案,一次又一次地画imges将满足需要。谢谢你们的支持。为了将来的参考,下面的答案是正确的,但你们也可以参考:我有另一个关于图像的情况。我发布了一个问题。看看你能不能再帮忙。谢谢