本人用 django制作了一个个人图片画廊.所以照片需要压缩.千方百计的寻找图片无损压缩(小损也行)方式.以下为历程
找了各种压缩命令行,均无明显见效,还发生了图片越来越大的事情,(可能是我实在不懂命令...),可能我遇到了这个问题:
https://yq.aliyun.com/articles/74634
不懂, 所以有下方的解决方式
要从 tinpng 说起. tinpng无疑是极致压缩的标杆.所以一切压缩后的大小都以 tinpng 为目标
但是之前尝试了很多很多方式,各种控制台命令,都无法达到目标大小.尝试了好几天之后总结如下:
1.先用 PIL 压缩.
pillow 压缩无疑是最方便快捷的图片处理工具,我这里是清理了图片的 exif 信息.把图片从原来的4.2m 降低到1.5m(tinpng 上能压缩到938k,比较接近了,这张图片犹豫清晰度较高,所以无法有太夸张的压缩比)
不废话,上代码
img = Image.open(source_path)
# exif_dict = piexif.load(crop_img.info["exif"])
exif_bytes = piexif.dump({})
img.save(source_path+'.jpg', 'JPEG', exif=exif_bytes)
不过讨厌的是清除了 exif 信息,导致照片旋转了!唉.头大
2.保持旋转方向
如何保持旋转方向?照片里面存储的信息,这种信息包括地理位置,涉及隐私,必须要删除.
如图,exif 信息里面有orientation 信息.该信息是记录图片旋转方向的
旋转角度 | 参数 |
0° | 1 |
顺时针90° | 6 |
逆时针90° | 8 |
180° | 3 |
img = Image.open(source_path)
old_exif = piexif.load(img.info["exif"])
if '0th' in old_exif and piexif.ImageIFD.Orientation in old_exif['0th']:
orientation = old_exif['0th'][piexif.ImageIFD.Orientation]
if orientation == 6:
img = img.rotate(-90, expand=True)
if orientation == 3:
img = img.rotate(180)
if orientation == 8:
img = img.rotate(90, expand=True)
exif_bytes = piexif.dump({})img.save(source_path + '.jpg', 'JPEG', exif=exif_bytes)
这里对了三个角度做旋转,显示方向没问题
在此之后,我缩放了它尺寸.等比压缩到2000X2000以下,博客第一张图片从4.2m 压缩到了523k,这并不让人满意,因为该尺寸的图片,在 tinpng 中能压缩到417.7k!(PILLOW 内心 os:臣妾实在做不到啊....TAT)
3.使用 google 的webp 进一步压缩
谷歌的 webp 无疑给了我一丝希望(webp os:(‧_‧?)有事说事,脏手拿开,别污染了我腿毛)
官网:自行翻墙:https://developers.google.com/speed/webp/docs/using
使用:命令行:
./cwebp or_6.jpg -o image.webp
执行完毕.发现 webp 文件大小为364k!
可是还是大啊,不过 webp 的 api 还是很全面的,加上-size 204800 限制在200k 左右
./cwebp -size 204800 or_6.jpg -o image.webp
完美的一匹...(webp os:喏.)
其实之后还要做很多事情,比如 safari 好像不显示 webp 图片等等.不过这些都不重要.网上有解决方法.(虽然暂时不会,但是很有信心的样子!以后附上)
最后附上 webp 的参数表
参数
WebP cwebp(译)