自动优化图片

1.压缩jpeg:

接到这个任务,我首先找到了jpegoptim(https://github.com/tjko/jpegoptim),然后编译,实验了一下:

jpegoptim.exe -o input.jpg -S 90% -d dest_path 或 jpegoptim.exe -o input.jpg -m 90 -d dest_path

两者有区别的。-S表示压缩到原文件的百分之多少,-m则对应jpg的质量

很明显,这个只能指定压缩,和任务相去甚远,不同的jpg没办法自动压缩啊。

知乎有人只招说用SNR(图片信噪比)比对,大概落在30+就可以了。

然后就是通过二分法实现一个很挫的方案(伪代码)

src_image=load(from_file);
max_p=100;
mix_p=1;
mid_p=(max_p+ mix_p)/2;
ok_file = NULL;
while(1)
{
    run(“jpegoptim.exe -o from.jpg -S %d%% -d dest_path”,mid_p);   //在dest_path目录下有一个与原文件同名jpg
    to_jpg_file = dest_path/file_name(from.jpg);
    cmp_image = load(to_jpg_file);
    Snr = snr_fun(src_image, cmp_image);
    if(Snr>=30)
    {
        max_p = mid_p;
        ok_file = to_jpg_file;
    }
    else
    {
        mix_p= mid_p;
    }
    mid_p=(max_p+ mix_p)/2;
}
if(ok_file)
{
    copy_file(ok_file,out_file);
    printf(“OK\n”);
}
else
{
    printf(“FAILED\n”);
}

其中snr_fun就是图像信噪比,说白了就是原图-比较图=差值图,然后10*lg(原图图的均方差/差值图的均方差),大概这样吧,有些会写20*lg(原图图的均方差/差值图的均方差),无所谓,最终要得到合理的经验值进行比对,具体的实现可以自行搜索一下。

好了,上面的伪代码是能实现自动优化jpg的,问题是效率相当低下,最差的需要7-8次,大概要10到20秒,烂大街的东西估计很快有人丢西红柿的。

好吧,我去翻了一下jpegoptim的代码,发现它实现-S的方案,其实是通过内存编码比对最终尺寸,那么为什么我不自己直接实现呢?于是先通过二分法先来个内存编码解码+SNR检查,获取最优的质量值(0-100),然后通过最优质量一次性调用“jpegoptim.exe -o input.jpg -m 质量值 -d dest_path”输出,不到2秒,还能接受,先用着吧。伪代码大概是这样:

src_image=load(from_file);
max_p=100;
mix_p=1;
mid_p=(max_p+ mix_p)/2;
ok_file = NULL;
percent = 100;
while(1)
{
    cmp_image_buffer = jpeg_zip(src_image, mid_p);
    cmp_image = load_memory(cmp_image_buffer);
    Snr = snr_fun(src_image, cmp_image);
    if(Snr>=30)
    {
        max_p = mid_p;
        percent = mid_p;
    }
    else
    {
        mix_p= mid_p;
    }
    mid_p=(max_p+ mix_p)/2;
}
run("jpegotim.exe -o input.jpg -m %d", percent);

2.png压缩:

拿到pngquant(https://github.com/kornelski/pngquant)项目编译一下,调用“pngquant.exe --quality 10-97 -f -o output.png input.png”就可以得到优化的png。如果直接调用libpngquant.lib也可以实现,抄作业(https://github.com/ImageOptim/libimagequant/blob/f54d2f1a3e1cf728e17326f4db0d45811c63f063/example.c)。我比对了一下,使用loadpng输出结果与pngquant直接输出的结果有差异,pngquant压缩更多,具体原因我没继续查,有兴趣的可以看看源码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值