Вращение изображения в PictureBox c# [дубликат]

82
21 ноября 2021, 08:20
На этот вопрос уже даны ответы здесь:
Вращение изображения c# (4 ответа)
Закрыт 1 год назад.

возникла проблема с вращение изображения в pictureBox. У меня есть изображение и я вращаю его в форме (угол вращения задаю с помощью trackbara), хочу это вращение выполнить в pictureBox, но к сожалению все мои попытки тщетны, и изображение никак не хочет вращаться, подскажите как данное вращение сделать в PictureBox, буду очень благодарен

 public Image img;
    public int RotationAngle;
    public Form1()
    {
        InitializeComponent();
        this.DoubleBuffered = true; // убираем мерцание
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        img = Image.FromFile(Application.StartupPath.ToString() + @"\image\Rocket.png");

    }
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap bitmap = new Bitmap(img, img.Width, img.Height); // создаем новый битмап
        e.Graphics.TranslateTransform(bitmap.Width * 5, bitmap.Height + 200 ); // перемещение в форме
        e.Graphics.RotateTransform(Convert.ToInt32(RotationAngle/ 1.5)); // угол вращения
        e.Graphics.TranslateTransform(-bitmap.Width / 2, -bitmap.Height - 200); // задаем точку вокруг которой осуществляется вращение
        e.Graphics.DrawImage(bitmap, bitmap.Width/6,bitmap.Height/6); // проецируем изображение
    }
    private void Form1_Resize(object sender, EventArgs e)
    {
        Invalidate();
    }
    private void trackBar1_ValueChanged(object sender, EventArgs e)
    {
        RotationAngle = trackBar1.Value;
        Invalidate();
    }
Answer 1

Код выглядит следующим образом

  private void Form1_Load(object sender, EventArgs e)
    {
        img = Image.FromFile(Application.StartupPath.ToString() + @"\image\Rocket.png");
      //  pictureBox1.BackgroundImage = Image.FromFile(Application.StartupPath.ToString() + @"\image\1.gif");
        aTimer = new System.Timers.Timer(10);
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }

    public void OnTimedEvent(Object source, ElapsedEventArgs e)
    {  
         Test();
    }
    public void Test()
    {
      Bitmap bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height); // создаем новый битмап  
      this.Invoke(new Action(() => bitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution)));
        using (Graphics gfx = Graphics.FromImage(bitmap))
        {
            gfx.TranslateTransform(pictureBox1.Width / 2 , pictureBox1.Height/2 +400); // перемещение в picturebox
            gfx.RotateTransform(Convert.ToInt32(RotationAngle / 1.5)); // угол вращения (Переменная RotationAngle)
            gfx.TranslateTransform(-pictureBox1.Width / 2, -pictureBox1.Height/2 -600); // задаем точку вокруг которой осуществляется вращение
            gfx.DrawImage(img, pictureBox1.Width/4, pictureBox1.Height/4);     // проецируем изображение                                                                    
        }
        pictureBox1.Image = bitmap;
    }

так вот если я делаю

bitmap.Dispose;

то picturebox выглядит вот так

 public void Test()
    {
      Bitmap bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height); // создаем новый битмап  
      this.Invoke(new Action(() => bitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution)));
        using (Graphics gfx = Graphics.FromImage(bitmap))
        {
            gfx.TranslateTransform(pictureBox1.Width / 2 , pictureBox1.Height/2 +400); // перемещение в picturebox
            gfx.RotateTransform(Convert.ToInt32(RotationAngle / 1.5)); // угол вращения (Переменная RotationAngle)
            gfx.TranslateTransform(-pictureBox1.Width / 2, -pictureBox1.Height/2 -600); // задаем точку вокруг которой осуществляется вращение
            gfx.DrawImage(img, pictureBox1.Width/4, pictureBox1.Height/4);     // проецируем изображение                                                                    
        }
        pictureBox1.Image = bitmap;
        bitmap.Dispose();
    }
Answer 2

Вот еще один пример кода

   public void Rotate(object sender, PaintEventArgs e)
    {
        //  e.Graphics.Clear(Color.Teal);
           this.Invoke(new Action(() => pictureBox1.Refresh()));
            Bitmap bitmap = new Bitmap(img, img.Width, img.Height); // создаем новый битмап   
            e.Graphics.TranslateTransform(bitmap.Width /2 , bitmap.Height + 200); // перемещение в picturebox
          e.Graphics.RotateTransform(Convert.ToInt32(RotationAngle / 1.5)); // угол вращения (Переменная RotationAngle)
           e.Graphics.TranslateTransform(-bitmap.Width/ 2, -bitmap.Height - 200); // задаем точку вокруг которой осуществляется вращение
           e.Graphics.DrawImage(bitmap, bitmap.Width / 6, bitmap.Height / 6);     // проецируем изображение
          bitmap.Dispose();
    }
Answer 3

Я же вам уже 100 раз сказал про наследование! Почему вы даже не попробовали наследоваться от класса PictureBox

Все делается буквально за минуту:

public sealed class RotatablePictureBox : PictureBox
{
    private float _angle;
    public RotatablePictureBox()
    {
        DoubleBuffered = true;
    }
    public float RotationAngle
    {
        get { return _angle; }
        set
        {
            _angle = value;
            Invalidate();
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        if (Image is null)
        {
            base.OnPaint(e);
            return;
        }
        e.Graphics.Clear(BackColor);
        e.Graphics.TranslateTransform(Width / 2.0f, Height / 2.0f + 400);
        e.Graphics.RotateTransform(RotationAngle / 1.5f);
        e.Graphics.TranslateTransform(-Width / 2.0f, -Height / 2.0f - 600.0f);
        e.Graphics.DrawImage(Image, Width / 4, Height / 4);
    }
}
READ ALSO
Как можно сделать текст на объекте

Как можно сделать текст на объекте

Как сделать текст на объекте, подобно этому скриншоту:

91
Добавление библиотеки в проект с описанием этой библиотеки

Добавление библиотеки в проект с описанием этой библиотеки

Создал dll - комментировал в ней все классы, методы и тд

95
Подключение базы данных C#

Подключение базы данных C#

Всем привет, создал приложение для авторизации пользователя по БД, но при запуске приложения на другом устройстве, не выходит БД, сейчас строка...

93
Работаю в Windows Forms c#

Работаю в Windows Forms c#

Есть кнопка и текстбокс, нужно что бы при нажатии на кнопку, начинался ввод в текстбоксКак это можно сделать? Не нашел нужной обработки события

69