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在这里有用吗?下面是它抛出的错误,sirSystem.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如果没有更多的上下文,我不知道,我刚刚下载了当天的工具-今天可能帮不了你哦,好的。不过谢谢你的帮助,先生!它解决了第一个问题非常感谢!