【问题标题】:.NET Saving jpeg with the same quality as it was loaded.NET 以与加载时相同的质量保存 jpeg
【发布时间】:2010-11-07 13:23:03
【问题描述】:

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

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

然后我像这样再次保存它:

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

它输出一个大小只有 700KB 左右的 jpg。有质量损失。

我也试过这样保存:

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);

这样可以保持尺寸(我也怀疑质量),但我是手动输入质量。

我想问:

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

提前谢谢你

【问题讨论】:

    标签: c# compression bitmap save jpeg


    【解决方案1】:

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

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

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

    一种选择可能是计算文件最终应该有多大才能具有大致相同的质量,然后将其保存多次,进行二进制搜索以找出最合适的质量。讨厌,但它可能会起作用。

    我暗中怀疑没有办法只保留原始质量设置,尽管我没有很好的怀疑理由......

    【讨论】:

    • 设置 PropertyItems 并重新保存会导致质量损失,因为图像将被重新编码。在这里阅读更多:stackoverflow.com/questions/1038206/…
    • 是的,我很欣赏它会被重新编码——但我认为如果你愿意的话,以与原始文件大致相同的“损失”重新编码是有意义的。您仍然会丢失数据,但可能不会很大。另请注意,我不是在谈论 setting PropertyItems - 我是在谈论 fetching 它以找出原始质量,尽管这似乎没有相关数据.
    • 我的意思是它没有填写在我使用的 jpeg 上 :) 不过我仍然不同意您的基本观点:我怀疑您通常 确实 想要存储与原始质量值相同的 jpeg,即使您会丢失质量。原始质量值显示您对质量的关心程度,新质量值也是如此。
    • 不,你不会得到 70% 的 70% - 这不是它的工作原理。不要忘记,当您重新加载它时,您将重新加载自然比完美原始文件更容易压缩的数据 - 因此您可以再次以“中等”质量压缩它,而不会丢失与开始时一样多的数据完美的原创。
    • Microsoft 在support.microsoft.com/kb/324790/en-us 上声明质量因子不存储在 jpeg 文件中,但如果它们是“通常”的量化表,则可以从量化表中推断出来。他们只是提供了那些“常用”量化表的原理和链接。
    【解决方案2】:

    您必须使用告诉 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);
    }
    

    【讨论】:

      【解决方案3】:

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

      但是,如果您进行裁剪或其他图像处理,则不可能在没有质量损失的情况下进行(从技术上讲,如果您使用乘以 16 的边界,则可以进行无损裁剪,但 AFAIK 不能使用 .net 中可用的库完成)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 2018-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多