Сложность Сохранение изображения в MemoryStream
Мне сложно сэкономить поток байтов от изображения (в данном случае, jpg) до объекта System.IO.MemoryStream
. Цель состоит в том, чтобы сохранить System.Drawing.Image
в MemoryStream
, а затем использовать MemoryStream
для записи изображения в массив байтов (в конечном итоге мне нужно вставить его в базу данных). Однако проверка переменной data
после закрытия MemoryStream
показывает, что все байты равны нулю... Я довольно тупой и не уверен, где я делаю неправильно...
using (Image image = Image.FromFile(filename))
{
byte[] data;
using (MemoryStream m = new MemoryStream())
{
image.Save(m, image.RawFormat);
data = new byte[m.Length];
m.Write(data, 0, data.Length);
}
// Inspecting data here shows the array to be filled with zeros...
}
Любые идеи будут очень оценены!
Ответы
Ответ 1
Чтобы загрузить данные из потока в массив, вы читаете, а не записываете (и вам нужно перемотать назад). Но, более просто в этом случае, ToArray()
:
using (MemoryStream m = new MemoryStream())
{
image.Save(m, image.RawFormat);
data = m.ToArray();
}
Ответ 2
Если целью является сохранение байтов изображения в базе данных, вы можете просто сделать:
byte[] imgData = System.IO.File.ReadAllBytes(@"path/to/image.extension");
И затем подключите логику базы данных, чтобы сохранить байты.
Ответ 3
Я нашел по другой причине эту статью несколько секунд назад, может быть, вы найдете ее полезной:
http://www.codeproject.com/KB/recipes/ImageConverter.aspx
В принципе, я не понимаю, почему вы пытаетесь написать пустой массив по потоку памяти с изображением. Это ваш способ очистить изображение?
Если это не так, прочитайте то, что вы написали в своем запоминающем потоке с помощью метода ToArray, и назначьте его вашему массиву байтов
И что все
Ответ 4
Попробуйте этот способ, он работает для меня
MemoryStream ms = new MemoryStream();
Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
panel1.DrawToBitmap(bmp, panel1.Bounds);
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] Pic_arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(Pic_arr, 0, Pic_arr.Length);
ms.Close();
Ну, вместо управления изображением я использовал панель управления.