【问题标题】:c# cannot use memory stream to convert byte array to bitmapc#不能使用内存流将字节数组转换为位图
【发布时间】:2026-01-22 23:10:01
【问题描述】:

我已经找了好几天了,所有关于如何转换填充了 imageData 的 byte[] 的当前答案都让我回到了这段代码:

using (var ms = new MemoryStream(byte[])) 
{
  Bitmap bit = new Bitmap(ms);
}

至少是这样的(我现在已经制作了很多版本..我不记得原版了) 但无论我如何使用它,当我尝试将流放入我的位图中时,我总是得到参数的“参数无效”。

这是我目前保存它的方式:

private static byte[] ConvertToByteArr(Bitmap bitmap)
    {
        byte[] result;            
        MemoryStream stream = new MemoryStream();
        bitmap.Save(stream, ImageFormat.Bmp);            
        result = stream.ToArray();

        return result;
    }

并在我将字典保存到 .txt 文件时调用它

这就是我试图再次阅读它的方式。

 TextReader reader = new StreamReader(trainingPath + "\\" + filename + ".txt");
        Dictionary<string, string> tempDict = new Dictionary<string, string>();
        String line;
        String[] parts;

        List<string> names = new List<string>();

        while ((line = reader.ReadLine()) != null)
        {
            parts = line.Split('=');

            string key = parts[0];
            string value = parts[1];
            tempDict.Add(key, value);

            Console.WriteLine("added " + key + " to temp Dict");

            byte[] byteArr = Encoding.ASCII.GetBytes(tempDict[key]);

            MemoryStream ms = new MemoryStream(byteArr);

            Bitmap bit = new Bitmap(Image.FromStream(ms));

            parts[0] = null;
            parts[1] = null;

        }

在 Bitmap bit = new Bitmap(Image.Fromstream(ms)) 行之前一切正常。

【问题讨论】:

  • I always get a 'parameter invalid' 抛出了什么exact异常?通过哪一行代码?
  • 发生异常时tempDict[key]准确值是多少?
  • 不要将二进制数据转换为字符串并返回,这是一种无法正常工作的方法
  • mjwills 我得到一个 'System.ArgumentException' tempDict[key] 的值是一个字节数组,其中包含来自我转换的位图的数据,以便我可以将大量数据保存到分类的 .txt 文件中。
  • saruman- 我这样做只是因为我有太多数据。我正在做一个机器学习项目,我需要向其中输入大量数据。但这些被保存为字典 以确保我有正确的信息。我认为将其保存到 .txt 文件比保存和搜索数据库所需的计算机处理能力更少。

标签: c# bitmap console memorystream


【解决方案1】:

当您从文本文件中读取时,请确保正在使用编码。 我尝试了一个示例代码,其中使用提到的相同方法(ConvertToByteArr)将位图保存为 byte[] 到文本文件中。 当我尝试从从该保存的文本文件的流读取器读取的内存流中创建位图对象时,我遇到了同样的错误。

但是当我使用 ASCII 编码时,它工作得很好。

TextReader reader = new StreamReader(textfile, Encoding.ASCII, true);

【讨论】:

    【解决方案2】:

    不推荐使用 Encoding.GetBytes() 和 Encoding.GetString()。
    有一种情况,上面的相互转换并不顺利。
    (就像你经历过的那样)

    我建议使用十六进制字符串。
    您可以将字节数组转换为字符串(十六进制),如下所示:

    byte[] byteArr = ConvertToByteArr(bitmap);
    string str = BitConverter.ToString(byteArr).Replace("-", "");
    


    此外,您可以将字符串(如上所述)转换为字节数组,如下所示:

    private byte[] HexaToBytes(string str)
    {
        byte[] byteArr = new byte[str.Length / 2];
        for (int i = 0; i < byteArr.Length; i++)
        {
            string s = str.Substring(i * 2, 2);
            byteArr[i] = Convert.ToByte(s, 16);
        }
        return byteArr;
    }
    

    【讨论】:

    • 所以,我尝试实现这一点,但是当它到达 byte[i] = Convert.ToByte(s, 16); 时出现错误它抛出一个'System.FormatException
    • 或使用 base64 以及 Convert.ToBase64String(byte[])Convert.FromBase64String(string) 比滚动您自己的十六进制转换器更容易,并且占用的写入字节更少
    • @Tanya 抱歉回复晚了...您是如何获得 HexaToBytes 方法的“str”(字符串)参数的?该字符串必须从您定义的“ConvertToByteArr”方法返回的字节数组创建。
    • 嗨,感谢您的回复 :) 我已经在一个完全不同的庄园解决了这个问题,但我不知道如何关闭这个线程。我发现无论我尝试用这种方法修复它多久,它总是会损坏