14

我有一个大炮数码相机,我将它设置为以超精细质量拍照,它会输出一个 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;
    }

和封装:

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

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

我想问一下:

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

先感谢您

4

3 回答 3

5

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

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

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

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

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

于 2009-07-02T07:18:15.430 回答
0

在此处阅读如何在不重新编码图像的情况下保存图像:操作方法:使用元数据重新编码 JPEG 图像

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

于 2009-07-02T07:22:36.997 回答
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);
}
于 2013-05-22T09:34:14.930 回答