创建图形并将其保存为位图

8

我有两个问题:

1)我有一个 PictureBox,它的 Dock 属性设置为 Fill。当我调整 Form 的大小时,我无法在扩展部分的 PictureBox 上创建图形。这是什么问题?

2)我想将在 PictureBox 上创建的图形转换为 Bitmap 并保存为 *.JPG 或 *.bmp。如何做到这一点?

4个回答

7
您可以使用句柄设备从图片框中获取位图。
Graphics g = pictureBox1.CreateGraphics();          
Bitmap bitMap = Bitmap.FromHbitmap(g.GetHdc());
bitMap.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);

更好的做法是,如果pictureBox没有修改图像,您可以直接从pictureBox控件获取图像。

pictureBox1.Image.Save("path", System.Drawing.Imaging.ImageFormat.Jpeg);

2

我用这个方法,效果很好...

    private void SaveControlImage(Control ctr)
    {
        try
        {
            var imagePath = @"C:\Image.png";

            Image bmp = new Bitmap(ctr.Width, ctr.Height);
            var gg = Graphics.FromImage(bmp);
            var rect = ctr.RectangleToScreen(ctr.ClientRectangle);
            gg.CopyFromScreen(rect.Location, Point.Empty, ctr.Size);

            bmp.Save(imagePath);
            Process.Start(imagePath);

        }
        catch (Exception)
        {
            //
        }
    }

我之前尝试过这个,不幸的是,你保存的图像会受限于控件本身的大小。因此,如果你使用缩放将一个巨大的图像适应到控件中,当你导出图像时,它将呈现为渲染后的大小而不是实际大小。 - Zorgarath

0
当Picturebox被调整大小以填充表单时,它的Image属性似乎保持不变。
因此,您需要处理PictureBox.OnSizeChanged事件,然后使用以下代码调整图像大小:
private void pictureBox1_SizeChanged(object sender, EventArgs e)
{
    if ((pictureBox1.Image != null))
    {
        pictureBox1.Image = new Bitmap(pictureBox1.Image, pictureBox1.Size);
    }
}

保存图片使用:

pictureBox1.Image.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);

希望这能有所帮助!

-1:这个问题与PictureBox的图像无关。他试图在控件上(PictureBox、Panle甚至是窗体本身)绘制一些稳定的东西。 - sorush-r

0

1) 你的描述非常模糊。你是否收到异常?它是否显示错误结果?发生了什么?

2) 你需要从PictureBox获取图像并使用其保存方法


我没有收到任何异常,也没有显示错误的结果,只是图形没有创建。 - Hesam Qodsi
请尝试更详细地描述这个问题...真的很难理解发生了什么。你怎么知道它没有被创建?这只有在将Dock设置为Fill时才会出现吗? - mafu
你知道PictureBox有一个MouseClick事件。当我点击PictureBox时,我想在它上面画一个矩形。这个功能是可以实现的,但是当我调整窗体大小以使PictureBox填充整个窗体时,PictureBox也会变得更大,就像窗体一样。在调整大小后,我无法在变大的部分上创建图形......希望你能理解我的问题。 - Hesam Qodsi
我可以解释得更详细一些:当从像PictureBox或Panel这样的控件创建Graphics对象时,绘制在其上的图形是不稳定的:控件的Paint事件将清除重新绘制的区域。例如,如果您尝试在具有Graphics对象的控件上显示一个小对话框,在对话框关闭后,它的区域将在控件上被清除。另一个例子:将窗口移动到屏幕边缘,使窗口的一半超出屏幕视图-->现在将窗口设置为正常状态,您将无法看到绘制在错误位置的一半的图形... - sorush-r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接