【问题标题】:Getting an Image object from a byte array从字节数组中获取 Image 对象
【发布时间】:2010-07-20 12:49:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net image gdi+


    【解决方案1】:

    您将使用 MemoryStream 来执行此操作:

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

    【讨论】:

    • 这会很好用。您知道将其重新放入字节数组的方法吗?调整大小后,我需要将调整大小的图像放回数据库中。
    • 我明白了 :) 谢谢 Image.Save(Stream, ImageFormat) - msdn.microsoft.com/en-us/library/ms142147.aspx
    • 这个答案并不完全正确,您正在从流中读取图像并随后关闭此流。根据 MSDN,您必须在图像的生命周期内保持流打开。对于某些图像格式(不是全部),您肯定需要这个。所以正确的方法是从加载的图像中创建新的位图,然后将它们都处理流和原始图像。
    • @arbiter:已编辑以将“img”放入 using(){} 块中。我暂时忘记了它是 IDisposable。 (虽然如果你不这样做,它可能会正常工作......)谢谢!
    【解决方案2】:

    根据您对另一个答案的 cmets,您可以尝试对存储在 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[]。

    【讨论】:

      【解决方案3】:

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

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

      编辑: 这里有一个更高级的解决方案:https://stackoverflow.com/a/16576471/253938

      【讨论】:

        【解决方案4】:

        我想我会添加这个作为答案,让它更明显。

        将其保存回字节数组:

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

        【讨论】:

        • 重现仲裁者的评论:ResizeImage 应该在 ImageStream using 块内,因为对 localImage 的调用可能需要在处理 ImageStream 之前访问它,并且您应该处理由返回的(可能是新的?)localImage也调整图像大小。
        猜你喜欢
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-30
        • 2022-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多