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

14 c# compression jpeg bitmap save

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

imgPicture = Image.FromFile(Config.WorkDirectory + this.TempPhotoName);
bmpPicture = new Bitmap(imgPicture);
Run Code Online (Sandbox Code Playgroud)

然后我再次保存它:

bmpModified.Save(Config.WorkDirectory + this.TempPhotoName,System.Drawing.Imaging.ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)

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

我也试过像这样保存它:

bmpPicture.Save(Config.WorkDirectory + this.TempPhotoName, codecJpeg, encparams);
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

和encparams:

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

这样,尺寸(我怀疑质量)也保持不变,但我手工输入质量.

我想问一下:

有没有一种方法可以保存图像与加载时的质量相同,而无需硬编码质量值?

先感谢您

Jon*_*eet 5

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

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

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

一种选择可能是找出文件最终应该具有大致相同质量的大小,然后保存几次,进行二分查找以找出最合适的质量.Icky,但它可能会奏效.

我有一种潜在的怀疑,即没有办法保持原有的质量设置,尽管我没有很好的理由怀疑......

  • 不,你不会得到70%的70% - 这不是它的工作方式.不要忘记,当您重新加载它时,您将重新加载比完美原始文件更容易压缩的数据 - 因此您可以再次以"中等"质量压缩它而不会丢失尽可能多的数据,就像您开始时一样完美的原创. (3认同)
  • 设置PropertyItems并重新保存将导致质量损失,因为图像将被重新编码.在这里阅读更多内容:http://stackoverflow.com/questions/1038206/net-c-library-for-lossless-exif-rewriting (2认同)