使用c#进行高质量JPEG压缩

Bar*_*ran 36 .net c# compression jpeg image

我正在使用C#并希望使用JPEG格式保存图像.然而,.NET降低了图像的质量,并通过压缩来保存它们是不够的.

我想保存原始质量和大小的文件.我使用以下代码,但压缩和质量不像原始的.

Bitmap bm = (Bitmap)Image.FromFile(FilePath); 
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
ImageCodecInfo ici = null; 

foreach (ImageCodecInfo codec in codecs)
{ 
    if (codec.MimeType == "image/jpeg") 
    ici = codec; 
} 

EncoderParameters ep = new EncoderParameters(); 
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100); 
bm.Save("C:\\quality" + x.ToString() + ".jpg", ici, ep);
Run Code Online (Sandbox Code Playgroud)

我正在归档工作室照片和质量和压缩是非常重要的.谢谢.

Chr*_*ini 19

内置到库中的.Net编码器(至少是Microsoft提供的默认Windows库)非常糟糕:

http://b9dev.blogspot.com/2013/06/nets-built-in-jpeg-encoder-convenient.html

部分更新

我现在使用这里概述的方法,使用ImageMagick进行调整大小,然后使用jpegoptim进行最终压缩,结果更好.我意识到这是一个部分答案,但我会在一次允许的情况下对此进行扩展.

较旧的答案

ImageMagick是我迄今为止找到的最佳选择.它执行相对稳定的jpeg压缩.

http://magick.codeplex.com/

它有几个缺点:

  1. 它更好但不完美.特别是,它的色度子采样设置为90%或更高的高细节,然后跳到更低的细节级别 - 一个可以引入大量伪像.如果你想忽略子采样,这实际上非常方便.但是如果你想要50%的高细节子采样,你将面临更大的挑战.它仍然不会完全达到Photoshop或Google PageSpeed的质量/压缩级别.

  2. 它在服务器上有一个特殊的部署负担,很容易错过.它需要安装Visual Studio 2008 SDK lib.这个lib可以在任何带有Visual Studio的开发机器上使用,但是你第一次点击服务器它就会出现一个模糊的错误.这是潜伏的陷阱之一,大多数人都没有脚本/自动化,你将在未来的服务器迁移期间绊倒它.

最古老的答案

我挖了一个项目,通过翻译C项目来实现C#JPEG编码器:

http://www.codeproject.com/Articles/83225/A-Simple-JPEG-Encoder-in-C

我稍微简化了一下:

https://github.com/b9chris/ArpanJpegEncoder

它产生比.Net内置更高质量的JPEG,但仍然不如Gimp或Photoshop.文件大小也往往更大.

BitMiracle的实现几乎与.Net内置相同 - 相同的质量问题.

可能只是包装一个现有的开源实现,比如PageSpeed Tools中的Google jpeg_optimizer - 看起来像libjpeg,将是最有效的选择.

更新

ArpanJpegEncoder一旦部署就会​​出现问题 - 也许我需要增加代码的信任级别,或者可能还有其他事情正在发生.在本地,它可以很好地写入图像,但是一旦部署,我每次都会从中获得一张空白的黑色图像.如果我确定原因,我会更新.只是警告其他人考虑它.

  • 我是Magick.NET的创建者,我想告诉你,我最近添加了一个JpegOptimizer类,可用于获得与Google PageSpeed相同的大小.您可能想要更新答案. (5认同)
  • 提及内置.NET JPEG编码器的+1很糟糕.即使质量100,它仍然会明显降低质量.质量100产生低质量的大文件.使用这个.NET内置编码器,我发现最好(即合理的文件大小,以最小的质量损失)使用70(对于大图像)到90(对于小图像)的Encoder.Quality. (2认同)

Mic*_*odd 12

看起来您将质量设置为100%.这意味着不会有压缩.

如果您更改压缩级别(80,50等)并且您对质量不满意,则可能需要尝试使用其他图像库.LEADTools有一个很好的(非自由)引擎.

更新:作为一名评论者提到,使用JPEG时,100%质量仍然不意味着无损压缩.加载图像,对其执行某些操作,然后再次保存,最终会导致图像质量下降.如果您需要更改和保存图像而不丢失任何数据,则需要使用无损格式,如TIFF,PNG或BMP.我会使用压缩的TIFF(因为即使它被压缩它仍然无损)或PNG.

  • 在.NET JPG编码方面,将质量设置为100%并不意味着它无损.我个人在.NET代码中使用上面提到的LEADTools(FREE!)JPG编码器.它是一个可执行文件,我提供了一个图像源,启动可执行文件,然后将结果读回内存以进行进一步操作. (2认同)

Joh*_*zen 6

压缩和质量始终是一种折衷.

JPEG总是有损的.

您可能需要考虑使用PNG并使用PNGCrush或PNGauntlet缩小文件