96编辑器旗下产品
找图
终身
ID:0
到期时间:永久
退出登录
您的位置:首页 > 百科管理 > 详情

离线图片压缩软件免费-怎么把手机图片压缩到200k

原创:找图网 2023-05-03 08:47:14
  • [免费精品] 图压-简单易用的图片压缩软件

  • 你可以根据需要,设定不同的压缩强度,批量将图片压缩到指定尺寸或“批量将图片压缩到指定大小”、输出指定格式,这也是很多同类压缩工具没有的贴心功能。

    此软件目前支持 JPG、PNG、GIF 和 SVG 等四种最常见的图片格式,并可以让用户自由调整「压缩强度」或设置「文件大小」。

    而且软件的界面非常简单易用,直接将需要压缩的图片拖放到窗口上就能完成批量压缩。

    图压是一款本地运行的工具,它无需联网,所有的图片压缩处理都在电脑本地上离线进行,相比各种在线图片压缩网站来说更加好用。一来处理速度和效率极高;二来可以免除上传图片到服务器耗时耗流量的麻烦;三来还能避免一些隐私相关的照片泄露的可能。

    •压缩到指定尺寸:在压缩的同时,指定目标图片的宽高尺寸。•压缩到指定大小:支持设定压缩后输出的图片文件大小。•批量处理:支持一次处理大量图片,就算有数百张也不在话下!•支持多种格式:支持 JPG/PNG/GIF/SVG 等多种图片格式进行压缩。•高级输出设置:输出的文件夹、文件名甚至文件格式均可自定义。•隐私保护:所有图片处理均在本地完成,图片不会被上传给任何人。

    •视觉无损压缩:使用最新的压缩算法,能大幅减少图片文件大小,而不损失视觉质量。•更快的压缩速度:与在线工具相比,图压使用本地运行的压缩引擎,压缩更快更高效。

    使用图压,可以在基本不影响图片视觉画质的情况下,一次拖放就能快速搞定图片批量压缩处理。可以大幅减少多图的网页、PPT、Word、PDF 等文档的大小,降低流量和传输时间。

    在上传图片遇到文件大小限制的时候,图压按文件大小压缩的功能也比很多同类工具更加好用。加上图压完全免费,且跨平台支持 Win 和 macOS,相比很多收费工具,它无疑更值得大家收藏备用。

  • Squoosh 批量高质量压缩图片

  • 最近手里有一大批相机图片,需要分享给团队人员。但是原文件出来的图片太大,整整有几十个G。团队人员又不需要原图,只需要有全部的照片即可。为此,想把图片压缩成高质量图片以减少体积。

    由于一直在用Google相册,对它之前采用高质量上传的图片印象不错,于是搜了搜Google的图片高质量压缩工具,找到了Squoosh。

    浏览器输入网址 / 即可访问Squoosh。Squoosh本身可离线使用,而且拥有美观界面,单独压缩几张图片相当给力。

    可以看到,80%压缩质量肉眼基本上分辨不出来区别,但是文件大小下降了三分之二。

    但是这个界面只能一张张手工操作,对于几十个G图片来说就是个噩梦。网上搜了下squoosh批量压缩,竟然没有找到一篇合适、准确的介绍,没办法只能自己慢慢摸索。

    在界面下方找到了Sqoosh CLI,应该是命令行版本的,点进去进入GitHub仓库。

    [图片上传失败...(image-ed2ba2-1624621975250)]/cli/

    ]( )

    看了下说明,应该不需要安装别的东西,能直接使用:

    我能直接使用,要是不能用的话,可以先去安装一下nodejs。

    使用方法:

    注意

    :这里有个坑,复制出来的参数直接用会报错,需要把 ' 和 " 给全部去掉才可以。

  • 怎么把手机图片压缩到200k

  • 背景

    在手机上用户随手拍一张衣服的照片,去找类似图片的需求比较明显,以图搜图项目目的就是满足用户的这部分需求。

    该项目初步预计5个类目,每个类目500万图片用于检索。经过特征提取,每张图片可以表示为30976维空间中的一个点,即可以用30976个float值表示,为了便于处理,我们将特征值乘以100000,在不损失float值精度的情况下,用int32_t存储图片特征。

    图片检索时需要计算query 图片和索引图片的欧式距离,图片之间计算欧式距离的耗时为50微秒,经过cpu指令集优化(sse),欧式距离计算耗时减少到13微秒。

    在压缩之前,所有图片的大小为 3T( 4 * 30k * 25000000),每台机器30G内存用于存储图片,需要100台机器存储全量图片。

    需要在计算欧式距离效率不降低的情况下,对图片进行压缩,大规模减少机器的占用。

    我们的目标是压缩到500G左右,即压缩之后每张图片20k左右,欧式距离计算耗时为15微秒左右。

    欧式距离计算要求耗时在微秒级别,已有的压缩方法,比如p4delta、valgrind压缩等在性能上不满足要求,需要我们根据数据特点自己定制压缩方法。

    成果

    目前的压缩方法单张图片由120k 压缩到了平均13k。

    欧式距离计算平均耗时为9微秒。

    这么靠谱的成果是如何做到的呢?

    初步尝试

    bitmap的方法

    观察数据特点,发现平均每张图片有7000个数为非0值,其他值都为 0。首先想到的是用bitmap表示30976个值在特定的位置是否是0。bitmap需要30976 / 8= 4k个字节。然后只存储非0值,需要7k * 4,压缩之后平均每张图片大小为32k。压缩代码大体如下:

    int bitmap_len = size / 8 + 8;

    uint64_t *bitmap = (uint64_t*)(cmpr_buf);

    int32_t *data = (int32_t*)(cmpr_buf + bitmap_len);

    for(unsigned int i=0;i<size;i++) {

    if(list[i] != 0) {

    data[index++] = list[i];

    bitmap[i/64] |= bit_mask_tab[i % 64];

    }

    }

    但是在计算图片之间的欧式距离时,需要遍历30976次bitmap,并判断特定位的值知否为0,即将bitmap和掩码数组进行与操作,比较耗时,计算耗时在100微秒以上。计算两个压缩图片的欧式距离代码:

    for(i=0; i<size/64; i++) { for(int j=0; j<64; j++) { a = 0; b = 0; if((bitmap1[i] & bit_mask_tab[j])) { a = data1[index1++]; } if((bitmap2[i] & bit_mask_tab[j])) { b = data2[index2++]; } olength += (a - b) * (a - b); } }

    采用offset的压缩方式

    我们只保存非0数据的off_set和value,off_set最大值30975,需要用int16_t来保存,value的范围0~100万,需要int32_t来表示,采用该方法的话,每个图片占用空间为42k (7k * (2 + 4))。

    for(int i=0; i<size; i++) {

    if(list[i] != 0) {

    index++;

    }

    }

    *(int16_t*) cmpr_buf = index;

    int16_t *p_off = (int16_t*)cmpr_buf + 1;

    int32_t *p_data = (int32_t*)(((char *)cmpr_buf) + sizeof(int16_t) * index + sizeof(int16_t));

    index = 0;

    for(int i=0; i<size; i++) {

    if(list[i] != 0) {

    p_off[index] = i;

    p_data[index] = list[i];

    index++;

    }

    }

    计算两个压缩图片的欧式距离的时候,采用按照off_set归并的方法:

    while(p_data1<end1 && p_data2 < end2){

    if(*p_off1 < *p_off2) {

    olength += *p_data1 * *p_data1;

    p_data1++;

    p_off1++;

    } else if(*p_off1 > *p_off2) {

    olength += *p_data2 * *p_data2;

    p_data2++;

    p_off2++;

    } else {

    olength += (*p_data1 - *p_data2) * (*p_data1 - *p_data2);

    p_data1++;

    p_data2++;

    p_off1++;

    p_off2++;

    }

    }

    该方法进行欧式距离的耗时为55微秒,我们认为是if 条件比较耗时,于是尝试了用位掩码替代if的方式:

    while(p_data1 < end1 && p_data2<end2) {

    a = ((*p_off1 - *p_off2) <= 0);

    b = ((*p_off2 - *p_off1) <= 0);

    tmp1 = -a & *p_data1;

    tmp2 = -b & *p_data2;

    p_off1 += a;

    p_off2 += b;

    p_data1 += a;

    p_data2 += b;

    tmp = tmp1 - tmp2;

    olength += tmp * tmp;

    }

    该方式消除了if 条件判断,但是耗时为70微秒,性能反而下降了,耗时的原因是cpu的指令增多了。

    性能优化

    场景分析

    两个压缩图片计算 --> 一个压缩一个非压缩

    目前的优化进入了一个瓶颈,如何才能提升性能到10微秒级别呢?我们回过头来重新考虑了一下应用场景,在线的场景是query图片和一系列图片计算距离,离线的场景是中心点图片和其他一系列图片计算距离也就是说都是一个图片和多个图片进行距离计算,这时一个图片不需要进行压缩,完全可以是非压缩的,即使该图片是压缩也可以先解压计算欧式距离实际上可以转化为一个非压缩图片和多个压缩图片计算欧式距离。对这样的情况,我们需要重新考虑提升效率的问题。

    确定采用off_set压缩方式

    对于计算一个压缩和一个非压缩图片欧式距离的问题,比较bitmap的压缩方式和off_set的压缩方式,off_set的压缩方式有明显的优势对于bitmap方式,最耗时的地方仍然是访问30976次bitmap,然后做与操作,来获取解压后的值,遍历30976次bitmap耗时,至少50微秒以上但是off_set的方式保存了7000个非0数据的off_set,我们只需要遍历7000次非0 数组就可以计算出欧式距离。

    一个压缩一个非压缩

    做法

    首先计算好非压缩图片的累加平方和,每次查询计算多次欧式距离,只计算一次累加平方和。

    遍历压缩图片数组,计算该值和另一张非压缩图片的对应off_set的差值的平方。

    对于压缩图片的为0的那些值来说,欧式距离只需要加上非压缩图片那些值的平方和。

    举例:

    a.非压缩图片:[0 2 3 0 4 0 0 5 6 0 0] ,压缩图片:[0 0 0 6 6 6 0 0 ]

    b.事先计算好非压缩图片的特定位之前的所有值的平方和:sqrt[0 4 13 13 29 29 29 54 90 90 90]

    c.压缩的数组为 off[3 4 5], data[6 6 6 ]

    d.遍历off和data数组

    olength += (6 - 0) * (6 - 0) olength += (sqrt[2] - sqrt[0])

    olength += (6 - 4) * (6 - 4)olength += (sqrt[3] - sqrt[3])

    olength += (6 - 0) * (6 - 0) olength += (sqrt[4] - sqrt[4])

    效率:20微秒

    该方法只需要遍历7000次数组, 进行7000次相减 平方操作和 7000次访问sqrt 数组操作,大大简化了复杂度。

    代码如下:

    data1为压缩数据,data2为非压缩数据:

    for(int i=0; i<num; i++) {

    olength += (data1[i] - data2[off1[i]]) * (data1[i] - data2[off1[i]]);

    olength += sqrt[off[i] - 1] - sqrt[off[i-1]];

    }

    最新文章 更多
    最新素材 更多
    公司介绍 网站地图 图片资讯
    Copyright © 2010-2022 山东找图网络科技有限公司  鲁ICP备18007836号-3  邮箱:15653358549@163.com