У меня есть массив байтов для изображения (сохраненный в базе данных). Я хочу создать Объект изображения, создать несколько Изображений различных размеров и сохранить их назад в базе данных (сохраните ее назад к массиву байтов).
Я не волнуюсь по поводу части базы данных или изменения размеров. Но есть ли простой способ загрузить Объект изображения, не сохранив файл к файловой системе и затем отложить его в массиве байтов, когда я сделан, изменив размер его? Я хотел бы сделать все это в памяти, если я могу.
Something like:
Image myImage = new Image(byte[]);
or
myImage.Load(byte[]);
Для этого нужно использовать 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();
}
}
}
}
Это позволит вам передать байт[]
, хранящийся в базе данных, выполнить любые необходимые преобразования, а затем вернуть новый байт[]
, который может быть сохранен в базе данных.
Я подумал, что добавлю это как ответ, чтобы сделать его более заметным.
С сохранением его обратно в массив байтов:
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();
}
}