繁体   English   中英

如何在“paint”winforms 应用程序中将图形 object 保存到 bitmap?

[英]How can I save a graphics object to a bitmap in a "paint" winforms application?

我的问题是:当我尝试将图形 object 保存到 bitmap 图像时,它没有正确保存,而是图像是黑色的,文件中没有其他内容。

我看过其他答案,但我认为在图形object中多次绘制时会有所不同。

所以,这是我的尝试,请让我知道我的问题出在哪里。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace PenFlip
{
    public partial class Match : Form
    {
        Graphics g;
        private int x = -1;
        private int y = -1;
        private bool moving;
        private Pen pen;
        private Bitmap testBmp;
        public Match()
        {
            InitializeComponent();
            g = panel1.CreateGraphics();
            g.SmoothingMode = SmoothingMode.AntiAlias;
            pen = new Pen(Color.Black, 5);
            pen.StartCap = pen.EndCap = LineCap.Round;
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            PictureBox pictureBox = (PictureBox) sender;
            pen.Color = pictureBox.BackColor;
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            moving = true;
            x = e.X;
            y = e.Y;
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (moving && x != -1 && y != -1)
            {
                g.DrawLine(pen, new Point(x, y), e.Location);
                x = e.X;
                y = e.Y;
            }
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            moving = false;
            x = -1;
            y = -1;
            g.Save();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // prints out the black image
            testBmp = new Bitmap(400, 200, g);
            testBmp.Save(@"test.bmp", ImageFormat.Bmp);
        }
    }
}

呃, Bitmap的使用很棘手并且有很多陷阱(这就是为什么不推荐使用它,顺便说一句)。 尝试从内存中的 bitmap 创建图形 object,而不是从控件中获取它。 bitmap 应该是主要的 object,而不是Graphics实例。 你不知道控件对你的 bitmap 做了什么。

所以在构造函数中,做类似的事情:

        public Match()
        {
            InitializeComponent();
            bitmap = new Bitmap(panel1.Width, panel1.Height, PixelFormat.Format32bppArgb);
            pen = new Pen(Color.Black, 5);
            pen.StartCap = pen.EndCap = LineCap.Round;
        }
        

在每个 function 中,从 bitmap 创建一个图形 object:

using (var graphics = Graphics.FromImage(image))
                    {
                        graphics.Draw(...);
                    }

您现在需要手动更新面板,例如通过附加到它的 OnPaint 事件。

暂无
暂无

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

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