.NET使用与加载时相同的质量保存jpeg

时间:2009-07-02 07:02:34

标签: c# compression bitmap save jpeg

我有一个大炮数码相机,我设置它拍摄超细质量的照片,它输出一个3兆的.jpg文件。 如果我在ASP.NET中加载它(这对于更改它的dpi分辨率或裁剪它或whaterver很有用)

imgPicture = Image.FromFile(Config.WorkDirectory + this.TempPhotoName);
bmpPicture = new Bitmap(imgPicture);

然后我再次保存它:

bmpModified.Save(Config.WorkDirectory + this.TempPhotoName,System.Drawing.Imaging.ImageFormat.Jpeg);

它输出的jpg大小只有700KB左右。质量下降。

我也试过像这样保存它:

bmpPicture.Save(Config.WorkDirectory + this.TempPhotoName, codecJpeg, encparams);

其中codecJpeg是

ImageCodecInfo codecJpeg = this.getEncoderInfo("image/jpeg");


    private ImageCodecInfo getEncoderInfo(string mimeType)
    {
        // Get image codecs for all image formats
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

        // Find the correct image codec
        for (int i = 0; i < codecs.Length; i++)
            if (codecs[i].MimeType == mimeType)
                return codecs[i];
        return null;
    }

和encparams:

EncoderParameters encparams = new EncoderParameters(1);
encparams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 97L);

这样大小(我怀疑质量)也保持不变,但我手工输入质量。

我想问:

有没有办法在不硬编码质量值的情况下以与加载时相同的质量保存图像?

提前谢谢

3 个答案:

答案 0 :(得分:5)

所以听起来你知道如何设置质量,你真的只需要知道如何从原始图像获取质量?

如果质量在元数据中,我怀疑Image.PropertyItems是你的朋友。 (我不知道JPEG编码器中是否还有标准的质量标准。)

编辑:我刚刚检查过,我下载的jpeg没有任何质量标签。

一个选项可能是找出文件最终应该具有大致相同质量的大小,然后保存几次,进行二分查找以找出最合适的质量。 Icky,但它可能会起作用。

我有一种潜在的怀疑,即不是只是保留原始质量设置的方法,尽管我没有很好的理由怀疑......

答案 1 :(得分:0)

请在此处阅读如何在不重新编码图像的情况下保存图像:How-to: Re-encode a JPEG Image with Metadata

但是,如果你进行裁剪或其他图像操作,就不可能在没有质量损失的情况下进行操作(从技术上讲,如果使用16倍的边界,可以做无损裁,但是AFAIK不能使用.net中提供的库完成。

答案 2 :(得分:0)

您必须使用其他参数告诉GDI +检测配色方案。

例如:

using (var img = Image.FromStream(fileupload.InputStream, true,true))
{
    img.Save(fileOnDisk, ImageFormat.Jpeg);
}

using (var img = Image.FromFile("yourimage", true))
{
    img.Save(fileOnDisk, ImageFormat.Jpeg);
}