简单的问题,我似乎无法找到一个合适的答案。
我试图将内存映像转换为字节数组,以便将其作为Base64String上传
Bitmap CapSc()
{
using(Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
{
using(Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
}
return bitmap;
}
}
Image toUpload;
toUpload = (Image)CapSc();
public static byte[] GetBytesFromImage(Image img)
{
if (img == null) return null;
using (MemoryStream stream = new MemoryStream())
{
img.Save(stream, img.RawFormat);
return stream.ToArray();
}
}
GetBytesFromImage(toUpload);
然而,' img.Save'在似乎需要EncoderParamaters的第三个参数的情况下不断返回错误,MSDN上没有示例代码或开发人员解决方案说这是必要的,但如果我存在或不存在它会不断返回错误。
具体错误是' Paramter不能为空。参数名称:编码器'
任何帮助都会非常感激。
答案 0 :(得分:1)
在您的Image.Save调用内部(您没有指定编码器),框架正在进行此调用:
ImageCodecInfo encoder = format.FindEncoder();
然后将该结果传递给指定编码器的重载。
发生的事情是FindEncoder
在您的案件中返回null
。因此,系统无法找到适用于ImageFormat
属性指定的任何RawFormat
的编码器。
要查看计算机上可用的编解码器,您可以迭代
的结果ImageCodeInfo.GetImageEncoders()
或者你可以选择一个你知道的就像jpeg:)
答案 1 :(得分:1)
这正是我过去一个月一直在做的事情。如果我没有错过任何内容,这应该有效(您可能需要额外的using
一两句话):
ImageCodecInfo codec;
EncoderParameters myEPS;
public YourConstructor() {
codec = GetEncoder(ImageFormat.Jpeg);
myEPS = new EncoderParameters(1);
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameter myEP = new EncoderParameter(myEncoder, 60L); // 0-100 quality level
myEPS.Param[0] = myEP;
}
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
public static byte[] GetBytesFromImage(Image img)
{
if (img == null) return null;
using (MemoryStream stream = new MemoryStream())
{
img.Save(stream, codec, myEPS);
return stream.ToArray();
}
}