使用保存位图时出现“参数无效”。

3

我正在尝试以指定的编码质量保存位图jpg格式。但是,当调用保存方法时,我遇到了异常(“参数无效”)。

如果在bmp.save中省略最后两个参数,则可以正常工作。

        EncoderParameters eps = new EncoderParameters(1);
        eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 16);
        ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
        string outfile = outputpath + "\\" + fileaddition + sourcefile.Name;
        bmp.Save(outfile,ici,eps );

        bmp.Dispose();
        image.Dispose();
        return true;
    }
    ImageCodecInfo GetEncoderInfo(string mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for (j = 0; j < encoders.Length; ++j)
        {
            if (encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }
}

谢谢你

2个回答

26

GDI+有点不稳定。你需要使用16L的值或将其转换为(long)。


在VB中,我一直使用标准的32位整数来表示质量值,没有出现任何问题。 - Ady
2
它是这样的。在C#中,“16”的字面类型是byte,在VB.NET中是Integer。EncoderParameter有构造函数,可以使用byte、short和long,但不支持int。在VB中你会得到正确的结果,但在C#中不会。 - Hans Passant
2
nobugz: 不,那是错误的。标准在§9.4.4.2中说:“如果字面量没有后缀,则它具有这些类型中可以表示其值的第一个类型:intuintlongulong。” 它永远不是 byte。或者这可能是 Microsoft C# 编译器的一个 bug? - Konrad Rudolph
谢谢。我也遇到了这个问题。 - crdx
谢谢,这个我自己想可能需要花费一些时间。 - Peter Moberg
“Clunky”听起来更适合描述这个问题;我的第一反应是遇到了一个bug! - Roman Starkov

4

您应该将质量值转换为长整型,如下所示:

eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)16);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接