Нарисовать прошлый Bitmap на новом так, чтобы небыл растянут рисунок, если новый Bitmap больше размером - C#

Узнай цену своей работы

Формулировка задачи:

Короче пытался сделать такое дело: Рисую фигуры на форме, когда отпускаю левую кнопку мыши (когда кнопка зажата, то растягивается например фигура), то фигура отрисовывается на Bitmap, получается, что прошлая фигура не затирается. При изменении размера окна, заново инициализируются все Graphics, и прошлый Bitmap рисуется на новом, чтобы сохранить прошлый рисунок, но на самом деле получается, что прошлый рисунок выглядит размазанно, то есть рисуется и растягивается (в случае увеличения окна). Как нарисовать нормально, чтобы прошлый рисунок отрисовался на новом и не был смазан?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WinForms_Paint
{
    public partial class Form1 : Form
    {
        Graphics _bmpGraphics;
        Graphics _gr;
        BufferedGraphics _bufferedGraphics;
        BufferedGraphicsContext _bufferedGraphicsContext;
        Point _downPoint;
        Point _movePoint;
        Pen _pen;
        Shape _drawableObject;
        Bitmap _bitmap;
        DrawMode _drawMode;
 
        public Form1()
        {
            InitializeComponent();
 
            _pen = new Pen(Color.Black);
            StartPosition = FormStartPosition.CenterScreen;
 
            _bufferedGraphicsContext = BufferedGraphicsManager.Current;
            InitializeGraphics();
 
            Resize += new EventHandler(Form1_Resize);
            MouseMove += new MouseEventHandler(Form1_MouseMove);
            MouseUp += new MouseEventHandler(Form1_MouseUp);
            MouseDown += new MouseEventHandler(Form1_MouseDown);
        }
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            _downPoint = e.Location;
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                _movePoint = e.Location;
                if (_drawableObject is Line)
                {
                    Line line = (Line)_drawableObject;
                    line.Begin = _downPoint;
                    line.End = _movePoint;
                    line.Pen = _pen;
                }
                else if (_drawableObject is Rect)
                {
                    Rect rect = (Rect)_drawableObject;
                    int width;
                    int height;
                    int x;
                    int y;
 
                    if (_movePoint.X > _downPoint.X)
                    {
                        width = _movePoint.X - _downPoint.X;
                        x = _downPoint.X;
                    }
                    else
                    {
                        width = _downPoint.X - _movePoint.X;
                        x = _movePoint.X;
                    }
                    if (_movePoint.Y > _downPoint.Y)
                    {
                        height = _movePoint.Y - _downPoint.Y;
                        y = _downPoint.Y;
                    }
                    else
                    {
                        height = _downPoint.Y - _movePoint.Y;
                        y = _movePoint.Y;
                    }
 
                    rect.Rectangle = new Rectangle(x, y, width, height);
                }
                DrawToBuffer();
            }
        }
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            switch (_drawMode)
            {
                case DrawMode.Figure:
                    if (_drawableObject != null)
                        _drawableObject.Draw(_bmpGraphics);
                    break;
                case DrawMode.Brush:
                    break;
            }
        }
 
        private void Form1_Resize(object sender, EventArgs e)
        {
            InitializeGraphics();
            Invalidate();
        }
 
        private void DrawToBuffer()
        {
            _bufferedGraphics.Graphics.Clear(BackColor);
 
            if (_drawableObject != null)
                _drawableObject.Draw(_bufferedGraphics.Graphics);
 
            _bufferedGraphics.Graphics.DrawImageUnscaled(_bitmap, 0, 0);
            _bufferedGraphics.Render();
        }
 
        private void InitializeGraphics()
        {
            _gr = CreateGraphics();
            _bufferedGraphics = _bufferedGraphicsContext.Allocate(_gr, ClientRectangle);
            bool notFirstInit = false;
            Bitmap prevBmp = null;
            if (_bitmap != null)
            {
                prevBmp = _bitmap;
                _bitmap = new Bitmap(_bitmap, ClientRectangle.Width, ClientRectangle.Height);
                notFirstInit = true;
            }
            else
                _bitmap = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
            _bmpGraphics = Graphics.FromImage(_bitmap);
            if (notFirstInit)
                _bmpGraphics.DrawImage(prevBmp, 0, 0, prevBmp.Width, prevBmp.Height);
        }
 
        private void tStrpButtonLine_Click(object sender, EventArgs e)
        {
            _drawableObject = new Line();
        }
 
        private void tStrpButtonRect_Click(object sender, EventArgs e)
        {
            _drawableObject = new Rect();
        }
 
        private void tStrpButtonEllipse_Click(object sender, EventArgs e)
        {
            //_drawableObject = 
        }
    }
}

Решение задачи: «Нарисовать прошлый Bitmap на новом так, чтобы небыл растянут рисунок, если новый Bitmap больше размером»

textual
Листинг программы
            _bitmap = new Bitmap(_canvasRect.Right, _canvasRect.Bottom);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы