0

パネル上の画像をBMPに保存しようとしていますが、保存するたびに空白の画像が表示されます。

図面コード

    private void DrawingPanel_MouseMove(object sender, MouseEventArgs e)
    {
        OldPoint = NewPoint;
        NewPoint = new Point(e.X, e.Y);

        if (e.Button == MouseButtons.Left)
        {
            Brush brush = new SolidBrush(Color.Red);
            Pen pen = new Pen(brush, 1);

            DrawingPanel.CreateGraphics().DrawLine(pen, OldPoint, NewPoint);
        }
    }

コードの保存

    void SaveBMP(string location)
    {
        Bitmap bmp = new Bitmap((int)DrawingPanel.Width, (int)DrawingPanel.Height);
        DrawingPanel.DrawToBitmap(bmp, new Rectangle(0, 0, DrawingPanel.Width, DrawingPanel.Height));

        FileStream saveStream = new FileStream(location + ".bmp", FileMode.OpenOrCreate);
        bmp.Save(saveStream, ImageFormat.Bmp);

        saveStream.Flush();
        saveStream.Close();
    }

最終結果

これが私が描いたものです

私が描いたもの

これは節約するものです

保存されるもの

4

1 に答える 1

2

OnPaintメソッドをオーバーライドするようにコードを変更する必要があります。これは、コントロールの外観をカスタマイズするときに従うデフォルトのパターンです。

特定のコードが機能しない理由は、DrawToBitmapが呼び出されたときにコントロール全体を確実に再描画する必要があるためです。この場合、メソッドには、コントロールへのカスタム描画に関する知識がありません。

実例は次のとおりです。

public partial class DrawingPanel : Panel
{
    private List<Point> drawnPoints;

    public DrawingPanel()
    {
        InitializeComponent();
        drawnPoints = new List<Point>();

        // Double buffering is needed for drawing this smoothly,
        // else we'll experience flickering
        // since we call invalidate for the whole control.
        this.DoubleBuffered = true; 
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        // NOTE: You would want to optimize the object allocations, 
        // e.g. creating the brush and pen in the constructor
        using (Brush brush = new SolidBrush(Color.Red))
        {
            using (Pen pen = new Pen(brush, 1))
            {
                // Redraw the stuff:
                for (int i = 1; i < drawnPoints.Count; i++)
                {
                    e.Graphics.DrawLine(pen, drawnPoints[i - 1], drawnPoints[i]);
                }
            }
        }
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);

        // Just saving the painted data here:
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            drawnPoints.Add(e.Location);
            this.Invalidate();
        }
    }

    public void SaveBitmap(string location)
    {
        Bitmap bmp = new Bitmap((int)Width, (int)Height);
        DrawToBitmap(bmp, new Rectangle(0, 0, Width, Height));

        using (FileStream saveStream = new FileStream(location + ".bmp", FileMode.OpenOrCreate))
        {
            bmp.Save(saveStream, ImageFormat.Bmp);
        }                       
    }
}
于 2013-02-03T17:51:42.657 に答える