从字节数组中获取Image对象

时间:2010-07-20 12:49:55

标签: .net image gdi+

我有一个图像的字节数组(存储在数据库中)。我想创建一个Image对象,创建几个不同大小的图像并将它们存储回数据库(将其保存回字节数组)。

我并不担心数据库部分或调整大小。但有没有一种简单的方法来加载Image对象而不将文件保存到文件系统,然后在我调整大小时将其放回到字节数组中?如果可以的话,我想在记忆中做到这一点。

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

4 个答案:

答案 0 :(得分:24)

你使用MemoryStream来做到这一点:

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

答案 1 :(得分:2)

根据您对其他答案的评论,您可以尝试对存储在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[]

答案 2 :(得分:2)

只回答问题的前半部分:这是一个单行解决方案,对我来说很合适,包含一个包含JPEG文件图像的字节数组。

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

编辑: 这是一个稍微更先进的解决方案:https://stackoverflow.com/a/16576471/253938

答案 3 :(得分:0)

我认为我会将此作为一个答案,以使其更加明显。

将其保存回字节数组:

    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();
        }

    }