Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#无法使用内存流将字节数组转换为位图_C#_Bitmap_Console_Memorystream - Fatal编程技术网

c#无法使用内存流将字节数组转换为位图

c#无法使用内存流将字节数组转换为位图,c#,bitmap,console,memorystream,C#,Bitmap,Console,Memorystream,我已经找了好几天了,现在所有关于如何转换一个字节[]的答案都让我回到了这段代码: using (var ms = new MemoryStream(byte[])) { Bitmap bit = new Bitmap(ms); } 至少是这样的(到现在为止我已经做了这么多版本了……我不记得原来的版本了) 但是,无论我如何使用它,当我尝试将流放入位图时,我总是会得到一个参数“parameter invalid” 以下是我目前如何保存它: private static byte[] Conv

我已经找了好几天了,现在所有关于如何转换一个字节[]的答案都让我回到了这段代码:

using (var ms = new MemoryStream(byte[])) 
{
  Bitmap bit = new Bitmap(ms);
}
至少是这样的(到现在为止我已经做了这么多版本了……我不记得原来的版本了) 但是,无论我如何使用它,当我尝试将流放入位图时,我总是会得到一个参数“parameter invalid”

以下是我目前如何保存它:

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;

        }
TextReader reader=newstreamreader(trainingPath+“\\\”+filename+“.txt”);
Dictionary tempDict=新字典();
弦线;
字符串[]部分;
列表名称=新列表();
而((line=reader.ReadLine())!=null)
{
零件=直线分割('=');
字符串键=部件[0];
字符串值=部分[1];
tempDict.Add(键、值);
控制台写入线(“在临时命令中添加“+键+”);
byte[]byteArr=Encoding.ASCII.GetBytes(tempDict[key]);
MemoryStream ms=新的MemoryStream(byteArr);
位图位=新位图(Image.FromStream(ms));
部分[0]=null;
第[1]部分=空;
}
在位图位=新位图(Image.Fromstream(ms))行之前,一切正常

不建议使用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[] 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;
}
private byte[]六字节(string str)
{
byte[]byteArr=新字节[str.Length/2];
for(int i=0;i
读取文本文件时,请确保正在使用编码。 我尝试了一个示例代码,其中我使用前面提到的相同方法(converttobytarr)将位图作为字节[]保存到文本文件中。 当我试图从已保存文本文件的streamreader读取的memorystream创建位图对象时,我遇到了相同的错误

但当我使用ASCII编码时,效果很好


TextReader=新的StreamReader(textfile,Encoding.ASCII,true)

我总是得到一个“参数无效”
引发了什么样的异常?哪一行代码?发生异常时,
tempDict[key]
的确切值是多少?不要将二进制数据转换为字符串并返回,这是不工作的单行道MJ将得到一个“System.ArgumentException”tempDict[key]的值是一个字节数组,其中包含位图I转换器中的数据,以便将大量数据保存到categorized.txt files.saruman中-我之所以这样做是因为我有太多的数据。我正在做一个机器学习项目,我需要向其中输入大量数据。但这些都保存为字典,以确保我有正确的信息。我认为把它保存到一个.txt文件会比保存和搜索数据库花费更少的计算机处理能力。所以,我尝试过实现这一点,但当它碰到字节[I]=Convert.ToByte(s,16);它强制转换'System.FormatException'或使用base64以及
Convert.ToBase64字符串(字节[])
Convert.FromBase64字符串(字符串)
比滚动您自己的十六进制转换器更容易,并且占用更少的写入空间bytes@Tanya很抱歉迟回复。。。您是如何获得HexaToBytes方法的“str”(string)参数的?字符串必须从您定义的“ConvertToByTerr”方法返回的字节数组中创建。您好,感谢您的回复:)我已在完全不同的领域解决了此问题,但我不确定如何关闭此线程。我发现,无论我用这种方法修复它多久,它总是以腐败告终