Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用c语言实现高质量JPEG压缩#_C#_.net_Image_Compression_Jpeg - Fatal编程技术网

C# 用c语言实现高质量JPEG压缩#

C# 用c语言实现高质量JPEG压缩#,c#,.net,image,compression,jpeg,C#,.net,Image,Compression,Jpeg,我正在使用C#,希望使用JPEG格式保存图像。然而.NET降低了图像的质量,并用压缩来保存图像,这是不够的 我想以原始质量和大小保存文件。我使用以下代码,但压缩和质量与原始代码不同 Bitmap bm = (Bitmap)Image.FromFile(FilePath); ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo ici = null; foreach (ImageCodecIn

我正在使用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);

我正在存档studio照片,质量和压缩非常重要。谢谢。

压缩和质量始终是一种权衡

JPEG总是有损的

您可能想考虑使用PNGMype或

使用PNG和缩小文件。 它必须保存文件,就像它的原始质量和大小一样


那没有多大意义。当使用有损压缩时,根据定义,您将丢失一些信息。压缩图像的目的是减小文件大小。如果您需要高质量,而jpeg不适合您,您可能必须使用某种类型的无损压缩,但您的文件大小不会减少很多。您可以尝试使用“标准”库压缩为jpeg(看看这是否会给您带来任何不同的结果(我对此表示怀疑,但我不知道.NET在幕后使用了什么)

压缩jpeg格式本身会降低质量。也许您应该研究文件压缩,例如。您可以对一组文件进行合理的压缩。

看起来您正在将质量设置为100%。这意味着将不进行压缩

如果您更改了压缩级别(80、50等),但对质量不满意,则可能需要尝试其他图像库。具有良好(非免费)引擎


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

关于.NET中压缩级别的设置,请查看此链接(包括所有内容):

再次提出你的问题: 通常,您会将用户上传的图像保存为PNG,然后使用此PNG作为基础生成不同大小的JPG(并且您只在JPG上添加水印,而不会在原始PNG上添加水印!)
这样做的好处是:如果以后为平台更改图像尺寸,则会保存原始PNG,并在此基础上重新计算任何新的图像尺寸。

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

部分更新 我现在使用的是,使用ImageMagick进行调整大小,然后使用jpegoptim进行最终压缩,结果要好得多。我知道这是一个部分答案,但一旦时间允许,我将对此进行扩展

老答案 ImageMagick是迄今为止我找到的最好的选择。它执行相对稳定的jpeg压缩

它有两个缺点:

  • 它更好,但并不完美。特别是,它的色度子采样设置为90%或更高的高细节,然后跳到一个较低的细节级别-一个可以引入大量伪影的级别。如果你想忽略子采样,这实际上是非常方便的。但是如果你想在比如说50%的高细节子采样,你有一个更大的challen它也不会达到Photoshop或Google PageSpeed的质量/压缩级别

  • 它在服务器上有一个特殊的部署负担,很容易被忽略。它需要安装一个Visual Studio 2008 SDK库。这个库可以在任何安装了Visual Studio的开发机器上使用,但是当你第一次点击服务器时,它会内爆,并出现一个模糊的错误。这是大多数人不会有scrip的潜在问题之一ted/automated,在将来的服务器迁移过程中,您会被它绊倒

  • 最古老的答案 我仔细研究了一下,发现了一个项目,通过将一个C项目翻译成以下内容来实现C#JPEG编码器:

    我稍微简化了一下:

    它生成的JPEG图像质量比.Net内置的要好得多,但仍然不如Gimp或Photoshop的好。文件大小也往往更大

    实际上与.Net内置的相同质量问题是相同的

    很可能,仅仅包装一个现有的开源实现,就像-看起来在下面一样,将是最有效的选择

    更新
    ArpanyPegEncoder在部署后似乎出现问题-可能我需要提高代码的信任级别,或者可能发生了其他事情。在本地,它可以很好地写入图像,但一旦部署,每次都会从中获得一个空白的黑色图像。如果我确定了原因,我将进行更新。这只是对考虑此问题的其他人的一个警告。

    设置质量当涉及到.NET JPG编码时,100%并不意味着它是无损的。我个人使用上述LEADTools(免费!)来自我的.NET代码的JPG编码器。它是一个可执行文件,我向其提供图像源,启动可执行文件,然后将结果读回内存以进行进一步操作。不仅如此,内置到.NET的JPEG编码器非常糟糕。您可以在蓝色背景上绘制一个黄色框,将编码器设置为JPEG 100%,而无需重新保存sti我会得到非常糟糕的结果。(我意识到几何图形在JPEG中不是最好的;想象一下,在加载的照片上用.Net绘制一个几何图形并想保存它;照片使JPEG成为最佳候选,.Net即使在100%的情况下也会产生令人无法接受的低质量。)JPEG算法的一部分是压缩-压缩一个JPEG或许多JPEG通常不会为您带来有意义的节省。+1提到内置的.NET JPEG编码器是不好的。它仍然会明显降低质量,即使质量为100.Q