Image.Save需要其他参数

时间:2014-10-17 14:55:39

标签: c# arrays image byte

简单的问题,我似乎无法找到一个合适的答案。

我试图将内存映像转换为字节数组,以便将其作为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不能为空。参数名称:编码器'

任何帮助都会非常感激。

2 个答案:

答案 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();
    }
}