Получение объекта Image из байтового массива

У меня есть байтовый массив для изображения (хранится в базе данных). Я хочу создать объект Image, создать несколько изображений разного размера и сохранить их обратно в базе данных (сохранить обратно в байтовом массиве).

Меня не беспокоит ни часть базы данных, ни изменение размера. Но есть ли простой способ загрузить объект Image без сохранения файла в файловой системе, а затем поместить его обратно в байтовый массив, когда я закончу с его изменением размера? Я хотел бы сделать все это в памяти, если смогу.

Something like:
Image myImage = new Image(byte[]);
or
myImage.Load(byte[]);

4 ответа

Решение

Вы бы использовали MemoryStream для этого:

byte[] bytes;
...
using (var ms = new System.IO.MemoryStream(bytes)) {
   using(var img = Image.FromStream(ms)) {
      ...
   }
}

Основываясь на ваших комментариях к другому ответу, вы можете попробовать это для выполнения преобразования изображения, хранящегося в byte[] затем возвращает результат как другой byte[],

public byte[] TransformImage(byte[] imageData)
{
    using(var input = new MemoryStream(imageData))
    {
        using(Image img = Image.FromStream(input))
        {
            // perform your transformations

            using(var output = new MemoryStream())
            {
                img.Save(output, ImageFormat.Bmp);

                return output.ToArray();
            }
        }
    }
}

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

Только отвечая на первую половину вопроса: вот решение с одной линией, которое хорошо работает для меня с байтовым массивом, который содержит изображение файла JPEG.

Image x = (Bitmap)((new ImageConverter()).ConvertFrom(jpegByteArray));

РЕДАКТИРОВАТЬ: И вот немного более продвинутое решение: /questions/23519902/kak-preobrazovat-izobrazhenie-v-bajtovyij-massiv/23519924#23519924

Я думал, что добавлю это как ответ, чтобы сделать это более заметным.

Сохранив его обратно в байтовый массив:

    public Image localImage;
    public byte[] ImageBytes;

    public FUU_Image(byte[] bytes)
    {
        using (MemoryStream ImageStream = new System.IO.MemoryStream(bytes))
        {
            localImage = Image.FromStream(ImageStream);
        }

        localImage = ResizeImage(localImage);

        using (MemoryStream ImageStreamOut = new MemoryStream())
        {
            localImage.Save(ImageStreamOut, ImageFormat.Jpeg);
            ImageBytes = ImageStreamOut.ToArray();
        }

    }
Другие вопросы по тегам