Как реализовать сохранение и выбор изображения для экспорта в WORD из динамической панели

В данный момент при нажатии кнопки экспорта, программа делает новый скрин, который передает в Word, и сохраняет в папку. не могу найти метод получения изображения из динамической панели. Подскажите пожалуйста чем заменить Bitmap bmp = new Bitmap(pb_capture.Image, 300, 200);, чтобы получить изображение из уже имеющегося динамически созданного picturebox

private void btn_screenshot_Click(object sender, EventArgs e)
    {            
        try
        {
            var panel = new TableLayoutPanel();

            panel.AutoSize = true;

            panel.MouseDown += btn_screenshot_MouseDown;

            Mat m = new Mat();

            capture.Retrieve(m);

            //параметры скриншота

            var pb = new PictureBox();

            pb.Image = m.ToImage<Bgr, byte>().Flip(Emgu.CV.CvEnum.FlipType.None).Bitmap;
            
            pb.SizeMode = PictureBoxSizeMode.Zoom;

            pb.Name = $"SMV_{tb_surename.Text}_{DateTime.Now.Hour}_{DateTime.Now.Minute}_{DateTime.Now.Second}_{DateTime.Now.Millisecond}";

            pb.Height = pb.Image.Height/4;

            pb.Width = pb.Image.Width/4;

            pb.MouseDown += btn_screenshot_MouseDown;

            //имя

            var name = new Label();

            name.MouseDown += btn_screenshot_MouseDown;

            name.Text = $"SMV_{tb_surename.Text}_{DateTime.Now.Hour}_{DateTime.Now.Minute}_{DateTime.Now.Second}_{DateTime.Now.Millisecond}";

            //кнопка экспорта

            var exportimage_btn = new Button();

            exportimage_btn.Text = "Выбрать";

            exportimage_btn.MouseDown += btn_screenshot_MouseDown;

            exportimage_btn.Click += Exportimage_btn_Click;

            //кнопка удалить

            var deleteimage_btn = new Button();

            deleteimage_btn.Text = "Удалить";

            deleteimage_btn.MouseDown += btn_screenshot_MouseDown;

            deleteimage_btn.Click += Deleteimage_btn_Click;

            //добавление панели

            panel.Controls.Add(pb);

            panel.Controls.Add(name);

            panel.Controls.Add(exportimage_btn);

            panel.Controls.Add(deleteimage_btn);

            flp_1.Controls.Add(panel);

            //сделать скриншот

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void Exportimage_btn_Click(object sender, EventArgs e)
    {            
        var exportButton = (Button)sender;

        var tableLayoutPanel = exportButton.Parent;            

        tableLayoutPanel.Controls.Remove(exportButton);

        flp_2.Controls.Add(tableLayoutPanel);

        exportButton.Dispose();

        if (!Directory.Exists(@"D:\BASE\Images"))
        {
            Directory.CreateDirectory(@"D:\BASE\Images");
            MessageBox.Show("Папка для снимков создана");
        }
        else
        {                            

            string path = @"D:\BASE\Images";
            path += $@"\{tb_surename.Text}_{DateTime.Now.Day} {DateTime.Now.Month} {DateTime.Now.Year}_{DateTime.Now.Hour} {DateTime.Now.Minute} {DateTime.Now.Second} {DateTime.Now.Millisecond}.png";

            Bitmap bmp = new Bitmap(pb_capture.Image, 300, 200);

            bmp.Save(path, ImageFormat.Png);
            // pb_capture.Image.Save(path, ImageFormat.Png);


            PathPNG.Add(path);
        }

    }

Можно ли действие Exportimage_btn_Click прописать в теле private void btn_screenshot_Click(object sender, EventArgs e), чтобы использовать все локальные переменные используемые в этом действии, или есть какой то более правильный метод решения этой проблемы?


Ответы (0 шт):