2016-05-31 5 views
1

Я беру некоторые (jpeg) изображения с камерой и вставляя их в базу данных (как blob). Чтобы вставить их в базу данных, я должен передать изображение в массив байтов.C#: ошибка возникает при попытке сохранить System.Drawing.Image в MemoryStream

Вот небольшой код, который выполняет преобразование в массив байтов:

public static byte[] JpegToByteArray(System.Drawing.Image imageIn) 
    {       
     MemoryStream ms = new MemoryStream(); 
     imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); //PROBLEM IS HERE! 
     return ms.ToArray(); 
    } 

Хотя, я уверен, что образ я прохожу в формате JPEG, «imageIn.Save (...)» выдает ошибку следующим образом:

enter image description here

Вот определение энергосберегающего способа:

public void Save(Stream stream, ImageFormat format); 
    // 
    // Summary: 
    //  Saves this System.Drawing.Image to the specified file in the specified format. 
    // 
    // Parameters: 
    // filename: 
    //  A string that contains the name of the file to which to save this System.Drawing.Image. 
    // 
    // format: 
    //  The System.Drawing.Imaging.ImageFormat for this System.Drawing.Image. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  filename or format is null. 
    // 
    // System.Runtime.InteropServices.ExternalException: 
    //  The image was saved with the wrong image format.-or- The image was saved 
    //  to the same file it was created from. 

Изображения, которые я извлекаю и передаю функции, никогда не сохраняются в/чтении из файловой системы. После того, как я вставляю изображение в базу данных, я удаляю его. И метод, который я получаю изображения, просто возвращает список System.Drawing.Image (с 4 элементами). В этом нет ничего особенного.

У вас есть идеи, почему это может случиться?

Спасибо за ваше время.

EDIT:

Я могу установить изображения в PictureBox, например:

pictureBox1.Image = imageIn; 
picturebox.Refresh(); 

Но, не может сохранять изображения ни MemoryStream, ни к файловой системе.

+0

Вы уверены, что * imageIn * имеет формат System.Drawing.Imaging.ImageFormat.Jpeg? –

+0

попробуйте сначала преобразовать его в Bitmap, а затем сохранить его в MemoryStream –

+0

Да, я уверен, что он в формате JPEG. Я щекочу это за «if (ImageFormat.Jpeg.Equals (clonedImage.RawFormat))». И, дорогой JericCruz, меня просят вставить их в формате jpeg, поэтому у меня нет роскоши изменить его. – blablabla

ответ

-2

Попробуйте this-

public static void PerisitImage(string path, IDbConnection connection) 
{ 
    using (var command = connection.CreateCommand()) 
    { 
     Image img = Image.FromFile (path); 
     MemoryStream tmpStream = new MemoryStream(); 
     img.Save (tmpStream, ImageFormat.Png); // change to other format 
     tmpStream.Seek (0, SeekOrigin.Begin); 
     byte[] imgBytes = new byte[MAX_IMG_SIZE]; 
     tmpStream.Read (imgBytes, 0, MAX_IMG_SIZE); 

     command.CommandText = "INSERT INTO images(payload) VALUES (:payload)"; 
     IDataParameter par = command.CreateParameter(); 
     par.ParameterName = "payload"; 
     par.DbType = DbType.Binary; 
     par.Value = imgBytes; 
     command.Parameters.Add(par); 
     command.ExecuteNonQuery(); 
    } 
} 

Source- How to save image in database using C#

+0

Уважаемый Сувик Гош, у меня проблемы с "img.Save" часть. Хотя, спасибо за интерес и этот полезный код. Я уверен, что это будет полезно для кого-то другого. Я ценю это. – blablabla

+3

Если вы не поняли вопроса, не используйте его название и скопируйте первый клик по переполнению стека. Это плагиат. Попробуйте понять вопрос или перейдите к следующему, чтобы ответить. – CodeCaster

+0

@blablabla извините за мое замешательство и спасибо за то, что я не взрыв на меня :). Я буду следовать этому сообщению за правильный ответ. –

Смежные вопросы