Загрузите изображение из picturebox.image в c#. net настольном приложении - PullRequest
1 голос
/ 28 марта 2020

Я занимаюсь разработкой настольного приложения, в котором я хочу выполнить определенную задачу, например Сохранить изображение в базе данных , Получить изображение из базы данных и показать в PictureBox и Скачать изображение и сохранить в папке из Picturebox Tool

Вот код задачи,

  1. Сохранить изображение в базе данных , в этом я используя функцию ImageToBase64 для сохранения в базе данных в строковом формате. как: ImageToBase64(pictureBox1.Image, System.Drawing.Imaging.ImageFormat.Jpeg)

Код функции ImageToBase64:

public string ImageToBase64(Image image, System.Drawing.Imaging.ImageFormat format)
{
    using (MemoryStream ms = new MemoryStream())
    {
        if (image != null)
        {
            // Convert Image to byte[]
            image.Save(ms, format);
            byte[] imageBytes = ms.ToArray();

            // Convert byte[] to Base64 String
            string base64String = Convert.ToBase64String(imageBytes);
            return base64String;
        }
        else
        {
            return null;
        }
    }
}

Теперь для получения изображения из базы данных и отображения изображения в picturebox

picturebox1.image = Base64ToImage(dtSelStock.Rows[0]["DesignImage"].ToString())

Функция Base64ToImage Код:

public Image Base64ToImage(string base64String)
{
    if (base64String != "")
    {
        // Convert Base64 String to byte[]
        byte[] imageBytes = Convert.FromBase64String(base64String);
        MemoryStream ms = new MemoryStream(imageBytes, 0,
          imageBytes.Length);

        // Convert byte[] to Image
        ms.Write(imageBytes, 0, imageBytes.Length);
        Image image = Image.FromStream(ms, true);
        return image;
    }
    else
    {
        return null;
    }
}

Итак, эти две задачи работают отлично. Но третья и последняя задача - сохранить изображение в папке из Picturebox. Я попробовал часть кода, но он не работал должным образом, на самом деле отображается ошибка, т.е.

pictureBox1.Image.Save("D\\Image\\'" + pictureBox1.Image + "'", ImageFormat.JPEGImage);

1 Ответ

0 голосов
/ 28 марта 2020

Следующий фрагмент кода воспроизводит вашу проблему.

   var dataString = ImageToBase64(pictureBox1.Image, System.Drawing.Imaging.ImageFormat.Jpeg);
   pictureBox2.Image = Base64ToImage(dataString);
   pictureBox2.Image.Save("D\\Images\\'" + pictureBox2.Image + "'", System.Drawing.Imaging.ImageFormat.Jpeg);

, которая относится к "D\\Image\\'" + pictureBox1.Image + "'"

Я получил следующую трассировку стека при выполнении этих фрагментов

System.Runtime.InteropServices.ExternalException
  HResult=0x80004005
  Message=A generic error occurred in GDI+.
  Source=System.Drawing
  StackTrace:
   at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
   at System.Drawing.Image.Save(String filename, ImageFormat format)
   at WindowsFormsApp1.Form1.button1_Click(Object sender, EventArgs e) in C:\Users\brcaswell\Source\Repos\WindowsFormsApp1\WindowsFormsApp1\Form1.cs:line 25
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at WindowsFormsApp1.Program.Main() in C:\Users\brcaswell\Source\Repos\WindowsFormsApp1\WindowsFormsApp1\Program.cs:line 19

это неверный путь к файлу и \ или каталог не существует.

это исправит его

   var filePath = @"D:\Images\";
   Directory.CreateDirectory(filePath);
   pictureBox2.Image.Save(Path.Combine(filePath, $"'{pictureBox2.Image}'"), System.Drawing.Imaging.ImageFormat.Jpeg);

Однако вы должны помнить, что '{pictureBox2.Image}' приведет к в типе toString и будет 'System.Drawing.Bitmap' в качестве имени файла. Вы должны исправить это и включить расширение файла

Path.Combine(filePath, "myImage.jpeg")

Кроме того, как @ 'Peter Duniho' упомянул в своем комментарии к этому вопросу, вы должны рассмотреть вопрос о сохранении этого файла изображения способом, не связанным с graphi c контекст элемента управления графическим блоком.


Кроме того, следует рассмотреть возможность сохранения изображений в виде двоичного файла byte[] в базе данных, а не в виде строковых представлений base64.

...