当字节数组的源是 jpg 时,从存储的字节数组创建位图并保存到磁盘会引发 GDI+ 异常

戴夫

我希望有人可以帮助解决我保存已作为字节数组提供给我的图像的问题。

版本:

  • .Net 框架 4.6.2
  • C# 7.2

故事是

  1. 用户上传图片
  2. 我们序列化成一个字节数组并存储它
  3. 稍后,我们获取该字节数组并创建一个内存流,并使用该流创建一个位图对象。
  4. 使用该位图对象保存到磁盘

当原始文件为 PNG 格式时,这一切都有效。但是当它是 Jpg 格式时它会失败。

下面是一些示例代码,您可以将其粘贴在基本控制台应用程序中,只要您引用 System.Drawing,它就会运行。

static void Main(string[] args)
{
    Console.WriteLine("Enter image file location");
    var filePath = Console.ReadLine();
    while (!File.Exists(filePath))
    {
        Console.WriteLine("Cannot find file. Try Again");
        filePath = Console.ReadLine();
    }

    byte[] bytes = File.ReadAllBytes(filePath);

    Bitmap image;
    using (var stream = new MemoryStream(bytes))
    {
        image = new Bitmap(stream);
    }

    WriteToFile(image);
    image.Dispose();
    Console.ReadKey();
}

private static void WriteToFile(Bitmap image)
{
    Console.WriteLine("Enter write location filename");
    var fileName = Console.ReadLine();
    image.Save(fileName);
    Console.WriteLine($"File saved to {fileName}");
}

如果原始图像是 PNG 可以正常工作,如果是 JPG 则失败。这是为什么?我看到位图类上的 Save 方法有一个采用ImageFormat实例的重载但是我只有原始字节数组,所以我不知道我的图像格式是什么。

任何帮助将不胜感激,谢谢!

编辑:我已经尝试在从原始文件创建字节数组和将其保存回磁盘时将图像格式指定为 JPG(参见下面的代码),并且使用 jpgs 它仍然继续失败。然而 Pngs 仍然可以正常工作

static void Main(string[] args)
{
    Console.WriteLine("Enter jpg file location");
    var filePath = Console.ReadLine();
    while (!File.Exists(filePath))
    {
        Console.WriteLine("Cannot find file. Try Again");
        filePath = Console.ReadLine();
    }

    byte[] bytes = CreateSerializedImage(filePath);

    Image image;
    using (var steram = new MemoryStream(bytes))
    {
        image = Image.FromStream(steram);
    }

    WriteToFile(image);
    image.Dispose();
    Console.ReadKey();
}

private static byte[] CreateSerializedImage(string filePath)
{
    var image = Image.FromFile(filePath);
    using (var stream = new MemoryStream())
    {
        image.Save(stream,ImageFormat.Jpeg);
        return stream.ToArray();
    }
}

private static void WriteToFile(Image image)
{
    Console.WriteLine("Enter write location filename");
    var fileName = Console.ReadLine();
    image.Save(fileName, ImageFormat.Jpeg);
    Console.WriteLine($"File saved to {fileName}");
}
迈克尔

您在MemoryStream写入图像之前处理,请尝试在保存文件后处理流。这对我有用:)

如果要获取图像格式,请尝试从流的前几个字节中检测它:

维基百科:文件签名列表

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过异常将字节数组转换为jpg图像文件

来自分类Dev

节点-插入MongoDB(字节数组)时引发异常

来自分类Dev

将时间戳附加到jpg字节数组

来自分类Dev

Java字节数组大于jpg图像

来自分类Dev

字节数组到图像异常,参数无效

来自分类Dev

将字节数组程序集加载到新的AppDomain中会引发FileNotFound异常

来自分类Dev

如何从字节数组创建位图?

来自分类Dev

存储字节数组

来自分类Dev

使用 Intent 在活动之间传递字节数组时如何修复“致命异常”?

来自分类Dev

Ruby:如何将字节数组转换为图像文件(.jpg,.png ...)

来自分类Dev

源字节数组转换为字符串,然后返回字节数组与源字节不同

来自分类Dev

字节数组移位产生的位图

来自分类Dev

字节数组移位产生的位图

来自分类Dev

Android 将流转换为字节数组内存不足异常

来自分类Dev

Concat字节数组

来自分类Dev

追加字节数组

来自分类Dev

声明字节数组

来自分类Dev

字节数组编组

来自分类Dev

字节数组右移

来自分类Dev

UnityWebRequest 字节数组

来自分类Dev

MySQL和Java:检索到的字节数组与存储时的字节数组不同

来自分类Dev

字节数组中的字节数

来自分类Dev

使用SharedPreferences保存字节数组

来自分类Dev

Android从字节数组保存GIF

来自分类Dev

从字节数组创建方法

来自分类Dev

从字节数组创建 XPS 文档

来自分类Dev

如何从字节数组快速创建位图图像

来自分类Dev

字节数组中的重复字节

来自分类常见问题

将字节数组保存到文件