将图像转换为字节数组时出错

时间:2019-06-24 16:23:25

标签: c# arrays system.drawing

我有一个脚本试图将图像转换为字节数组,但无法获取它来输出数组。

使用

Console.WriteLine(bytearray);

我只得到

的输出

System.Byte[]

以及尝试时

return bytearray; 我得到了错误

    'Program.Main(string[])' returns void, a return keyword must not be 
    followed by an object expression
byte[] bytearray;
using (MemoryStream ms = new MemoryStream())
{
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    bytearray = ms.ToArray();
    Console.WriteLine (bytearray);
}

我想要将图像输出到控制台的字节数组。任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

Console.WriteLinestring输出到控制台。但是参数可以是任何对象,而不仅仅是字符串。因此,如果参数是其他类型(例如字节数组),则它将调用对象的ToString()方法并将其写出。这始终有效,因为所有内容都继承自object,因此每个对象都有一个ToString()方法。

但是通常ToString()方法不会被覆盖。因此,它只执行object.ToString()即可返回对象类型的名称。

这就是为什么要这样做:

var byteArray = new byte[] { };
Console.WriteLine(byteArray);

您得到了:

  

System.Byte []

您可能想查看各个值,但是ToString()不会返回该值。它只是返回类型的名称。因此,如果您想实际输出每个字节的值,则必须明确地做到这一点:

foreach(var b in byteArray) 
    Console.WriteLine(b);

现在您不打WriteLine(object)。您正在呼叫WriteLine(int)(因为byte可以隐式转换为int)。 int可以表示为string,因此现在它知道如何将值写入控制台。


只是为了好玩,并且为了说明这个概念,您可以编写这样的类:

public class MyBytes : List<byte>
{
    public override string ToString()
    {
        return "These are my bytes:" 
               + Environment.NewLine 
               + string.Join(Environment.NewLine, this);
    }
}

它从List<Byte>继承并覆盖ToString()。如果创建MyBytes的实例,请填充它,并将其写入控制台:

var byteArray = new byte[] { 1, 2, 3 };
var myBytes = new MyBytes();
myBytes.AddRange(byteArray);
Console.WriteLine(myBytes);

您会看到它调用了您覆盖的ToString()方法:

  

这些是我的字节数:
  1
  2
  3

那只是为了说明。有时,如果我们知道要输出一个类的字符串表示形式,则覆盖ToString()是有意义的,但是我不会仅仅为了覆盖ToString()而创建整个类