【问题标题】:Convert Byte to Image jpg将字节转换为图像 jpg
【发布时间】:2018-12-06 06:53:41
【问题描述】:

我在将 byte[] 转换为 .jpg 文件时遇到问题。 当我尝试转换字节时,我在这个方法中遇到了一个异常:

using (MemoryStream ms = new MemoryStream(bytes, 0, bytes.Length))
{
   ms.Write(bytes, 0, bytes.Length);
   Image image = Image.FromStream(ms, true, false);
}

例外:

System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)中参数无效

有什么建议吗?

【问题讨论】:

    标签: c# image drawing memorystream


    【解决方案1】:

    解决方法*:删除行:ms.Write(bytes, 0, bytes.Length);

    * 如果这不起作用,则bytes 数组不包含有效的图像数据。


    原因:

    这一行使用字节数组中的字节初始化MemoryStream。它将在位置 0(开始)处开始流:

    using (MemoryStream ms = new MemoryStream(bytes, 0, bytes.Length))
    

    在你的情况下,它可以简化为:

    using (MemoryStream ms = new MemoryStream(bytes))
    

    然后这一行将相同的字节写入流中。它会将您的信息流留在位置bytes.Length(结束):

    ms.Write(bytes, 0, bytes.Length);
    

    这一行将尝试从当前位置(结尾)开始从流中读取图像。由于 0 字节不会生成图像,因此无法为您提供异常:

    Image image = Image.FromStream(ms, true, false);
    

    正如 Jimi 所指出的,最好将其包装成一个方法:

    public static Image ImageFromByteArray(byte[] bytes)
    {
        using (MemoryStream ms = new MemoryStream(bytes))
        using (Image image = Image.FromStream(ms, true, true))
        {
            return (Image)image.Clone();
        }
    }
    

    使用Clone()的原因是,如果原始流已被处理,可能会导致保存图像出现问题。

    【讨论】:

    • 只是一个建议,以避免头痛。最好将其转换为方法并以这种方式返回 Image:ms.Position = 0; using (Image image = Image.FromStream(ms, true)) { return (Image)image.Clone(); }. The Image should be detached from the Stream (which is immediately disposed of when exiting the using` 块)。或者在using 块之外声明Image 对象并将克隆的Image 分配给它。
    • 好的,谢谢,但还是有问题。我将此字符串转换为字节:“0x78DAED7A6758934BB776A8B211 ....”,我有相同的异常“参数无效”...您有针对这种情况的解决方案吗?
    • @Mear 您的图像数据可能有效。如果你可以通过像 pastebin 这样的网站提供它,我可以看看如果你愿意。
    • 这似乎不是有效的图像格式。如果我将它转换为二进制文件并用十六进制编辑器打开它,我看不到任何类型的图像标题。您从哪里获得这些数据?
    • “由 Zlib 压缩” - 这是一条非常重要的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2012-06-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多