C# 将位图保存到MemoryStream

C# 将位图保存到MemoryStream,c#,bitmap,memorystream,C#,Bitmap,Memorystream,我正在尝试将位图保存到MemoryStream,然后将其转换为字符串。但问题是,我有一个错误,它表明行img.Save(m,img.RawFormat)不能为null 位图来自指纹扫描,我将其转换为图像。现在我想使用MemoryStream将其数据转换为字符串。这是用于保存在数据库中的指纹数据。我不知道我哪里出错了。您可以在下面找到我的代码: Bitmap bitmap; bitmap = ConvertSampleToBitmap(Sample);

我正在尝试将位图保存到
MemoryStream
,然后将其转换为字符串。但问题是,我有一个错误,它表明行
img.Save(m,img.RawFormat)不能为
null

位图来自指纹扫描,我将其转换为图像。现在我想使用MemoryStream将其数据转换为字符串。这是用于保存在数据库中的指纹数据。我不知道我哪里出错了。您可以在下面找到我的代码:

        Bitmap bitmap;
        bitmap = ConvertSampleToBitmap(Sample);
        Bitmap img = new Bitmap(bitmap, fingerprint.Size);
        this.Invoke(new Function(delegate () {
            fingerprint.Image = img;   // fit the image into the picture box
        }));
        string ping;
        using (MemoryStream m = new MemoryStream())
        {
            img.Save(m, img.RawFormat);
            ping = m.ToString();
        }
我希望得到一个准确的答案,能够指出主要错误以及我应该更改代码的哪些部分。
尽管任何帮助都将不胜感激

有趣;这里发生的是:

public void Save(Stream stream, ImageFormat format)
{
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    ImageCodecInfo encoder = format.FindEncoder();
    this.Save(stream, encoder, null);
}
使用内部
保存
执行此检查:

public void Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
{
    if (stream == null)
    {
        throw new ArgumentNullException("stream");
    }
    if (encoder == null)
    {
        throw new ArgumentNullException("encoder");
    }
所以,;我们可以假设
format.FindEncoder()在此处返回
null
。碰巧,如果没有匹配的编解码器,这确实是默认设置:

internal ImageCodecInfo FindEncoder()
{
    foreach (ImageCodecInfo info in ImageCodecInfo.GetImageEncoders())
    {
        if (info.FormatID.Equals(this.guid))
        {
            return info;
        }
    }
    return null;
}
所以基本上,这并不清楚,但问题是:没有为您使用的图像格式找到编码器。尝试保存为已知格式,而不一定是从中加载的格式。可能使用
ImageFormat.Png
并将其保存为Png

img.Save(m, ImageFormat.Png);
正如评论中已经提到的,要获得其中的base-64,您需要:

ping = Convert.ToBase64String(m.GetBuffer(), 0, (int)m.Length);

六羟甲基三聚氰胺六甲醚;那里没有任何内容应该是
null
-这里的
m
img
都不应该是
null
-你确定这是抛出的行吗?但是,请注意,
m.ToString()
并不能满足您的需求。数据将是二进制的-您希望这里使用什么类型的字符串?十六进制(base-16)或base-64在这里有用吗?下面是它抛出的错误,sir
System.ArgumentNullException:'值不能为null。参数名称:编码器“
和base-64字符串实际上就是我需要的base-64:
ping=Convert.ToBase64String(m.GetBuffer(),0,(int)m.Length)-so;对于另一位-如果逐行遍历,
”值不能为空。参数名称:编码器“
来自
保存
行?我只是想确定一下,因为这看起来很奇怪;意思:我想知道
保存
是否需要在
this.Invoke
中(this.Invoke
中的所有内容都将在UI线程上发生)是的,先生。错误指向该保存行并突出显示
img
它现在可以读取指纹而不会出现错误,先生!谢谢你!但新的问题是它不会显示其字符串转换。我将
Save
行放在
Invoke
中,正如您前面提到的,并尝试在消息框中显示位图的字符串转换,但没有发生任何事情,应用程序只提示指纹图像。也许你也能帮我解决这个问题`我将
保存
行放在
调用函数
中,并以众所周知的格式保存位图。现在,它已经可以扫描指纹并将其显示到一个图片盒中,错误已经消失了,先生!多亏了:)但是字符串转换不起作用。我试图把它放在一个
消息框中,但什么也没发生。也许你也能帮我弄明白?我是新来C#所以我真的迷路了,对不起。下面是供您清楚理解的代码:
Bitmap;位图=ConvertSampleToBitmap(示例);位图img=新位图(位图,指纹.Size);this.Invoke(新函数(委托(){fingerprint.Image=img;字符串ping;使用(MemoryStream m=new MemoryStream()){img.Save(m,ImageFormat.Bmp);ping=Convert.ToBase64String(m.GetBuffer(),0,(int)m.Length);MessageBox.Show(ping);}})@GhoennWoods如果没有更多的上下文,我不知道,我刚刚下载了当天的工具-今天可能帮不了你哦,好的。不过谢谢你的帮助,先生!它解决了第一个问题非常感谢!