.NET使用与加载时相同的质量保存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); 

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

我想问一下:

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

先感谢您

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

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

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

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

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

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

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

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