据我所知,jpeg文件在其他图像扩展之间具有最佳压缩比,如果我更正,我们无法再压缩jpeg文件,因为它具有最佳压缩,所以请帮助我.我创建了一些jpegs如下:
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, _quality);
using(MemoryStream ms = new MemoryStream()) {
Bitmap capture = GetImage();
capture.Save(ms, ici, ep);
}
我用sharpziplib压缩它们,平均每个jpeg大小为130KB,压缩后每个文件压缩到大约70KB,怎么可能?只有2个答案,我可以想象.
1-我们可以通过zip库以更高的压缩比压缩Jpeg文件
2-我的jpeg文件没有正确创建,我们可以创建更好的jpeg(压缩率更高,因为我们无法用zip库压缩它们)
有人知道吗?如果我们能创造更好的jpegs,请帮助我.
编辑:
这是压缩jpegs的邮政编码:
void addnewentry(MemoryStream stream, string pass,
string ZipFilePath, string entryname){
ICSharpCode.SharpZipLib.Zip.ZipFile zf = new ZipFile(ZipFilePath);
if(!String.IsNullOrEmpty(pass))
zf.Password = pass;
StaticDataSource sds = new StaticDataSource(Stream);
zf.BeginUpdate();
zf.Add(sds, entryName);
zf.CommitUpdate();
zf.IsStreamOwner = true;
zf.Close();
}
public class StaticDataSource : IStaticDataSource {
public Stream stream { get; set; }
public StaticDataSource() {
this.stream.Position = 0;
}
public StaticDataSource(Stream stream) {
this.stream = stream;
this.stream.Position = 0;
}
public Stream GetSource() {
this.stream.Position = 0;
return stream;
}
}
解决方法:
正如大多数人已经说过的那样,您无法轻松压缩这些已经压缩的文件.有些人在JPEG重新压缩方面努力工作(重新压缩=部分解码已经压缩的文件,然后使用自定义更强的模型和熵编码器压缩这些数据.重新压缩通常可以确保比特相同的结果).即使是那种先进的再压缩技术,我也只看到了最多25%的改进. PackJPG是他们中的一员.你可以看看其他压缩机here.正如你所知,即使*压缩机也无法达到25%(即使它非常复杂).
考虑到这些事实,ZIP(实际上是deflate)不能提高压缩程度(如果你将它与十大压缩机进行比较,这是一个非常古老和低效的方法).我相信这个问题有两个可能的原因:
>您不小心向JPEG流添加了一些额外的数据(可能在JPEG流之后添加).
> .NET将大量冗余数据输出到JFIF文件.也许一些大的EXIF数据等.
要解决此问题,您可以使用JFIF转储工具来观察JFIF容器中的内容.此外,您可能想要使用PackJPG尝试JPEG文件.