图像.保存需要其他参数

本文关键字:其他 参数 保存 图像 | 更新日期: 2023-09-27 18:26:50

一个简单的问题,我似乎根本找不到合适的答案。

我正在尝试将内存映像转换为字节数组,以便将其上传为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上没有示例代码或开发人员解决方案说这是必要的,但如果我有或没有它,它总是返回错误。

具体错误为"参数不能为null"。参数名称:编码器

任何帮助都将不胜感激。

图像.保存需要其他参数

在您的Image.Save调用内部(您没有指定编码器),框架正在进行此调用:

ImageCodecInfo encoder = format.FindEncoder();

然后将该结果传递到指定编码器的过载中。

在您的情况下,FindEncoder正在返回null。因此,系统找不到适用于RawFormat属性指定的任何ImageFormat的编码器。

要查看您的机器上有哪些编解码器,您可以迭代的结果

ImageCodeInfo.GetImageEncoders()

或者你可以选择一个你知道的,比如jpeg:)

这正是我上个月一直在做的工作。如果我没有遗漏任何内容,这应该会起作用(您可能需要额外的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();
    }
}