web 项目的图片处理python

本人用 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 信息.该信息是记录图片旋转方向的

    

旋转角度 参数
1
顺时针90° 6
逆时针90° 8
180° 3
  读取上图,得到orientation值为6,顺时针调整图片后,朝向正确.那么接下来就很明确了,在图片保存的时候顺便做一下图片旋转操作,所以改代码咯, 清空了 exif 信息.
 
 
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(译)
cwebp
- 名称
cwebp - 压缩图片文件到webp文件中
- 简介
cwebp [options] input_file -o output_file.webp
- 描述
该页介绍了cwebp命令。
cwebp压缩图片使用了WebP格式,输入的格式可以是PNG、JPEG、TIFF或者原Y'CbCr(wiki)的样本。
- 选项(options)
基本选项有:
-o  string
指定输出的WebP的文件名称,如果忽略,会执行cwebp压缩,但只报告统计数据。
-h  -help
小的使用总结
-H  -longhelp
所有可能选项的集合
-version
打印版本号并退出
-q  float
指定压缩系数,介于0-100之间。小的压缩系数产生低质量小文件,最好的压缩系数是100。默认值为75
-alpha_q  int
指定alpha压缩的压缩系数,介于0-100,alpha的无损压缩是压缩系数为100时的结果,而低的系数值是在有损压缩中使用。默认系数值为100。
-f  int
指定去块效应的滤波程度,介于0(无过滤)-100(最大化过滤)。值0会关闭过滤,高的值会增加过滤的程度。滤值越高,图片越平滑。典型的值在20-50。
-preset  string
指定一组预先定义的参数,以适应特定类型的源材料。可能的值有:default、photo、picture、drawing、icon、text。由于 -preset 会重写其他参数的值(除了-q),这个选项最好出现在参数的最前面。
-sns  int
指定空间噪声成型的振幅。空间噪声成型(简写为sns,wiki)指的是一系列的内置算法,有它们决定图片的
哪些区域应该使用相对较少的比特,还有哪里可以将这些位进行更好的转换。可能的范围为0(关闭算法)到100(最大的效果)。默认值为80。
-m  int 
指定所用的压缩方法。此参数控制编码速度,而且压缩后的文件大小和质量之间进行权衡。可能的值范围为0-6,默认值为4。当值越高,编码器将花更多的时间检查其他编码的可能性,并决定的质量增加的大小。当值越低时,会加快较大文件的处理时间,但图片压缩质量较低。
-af
打开自动过滤器。打开自动筛选。该算法将花费更多的时间用来优化滤波强度达到一个良好的平衡的质量。
- 附加选项
更多高级选项如下:
-sharpness  int 
指定滤波的锐度(如果使用的话)。范围在0(最大锐度)到7(最小锐度)。该算法将花费更多的时间来优化滤波强度达到一个良好的平衡的质量。
-strong 
使用比默认(如果使用了-f选项)更强的滤波功能。该功能默认关闭。
-segments int
在使用的SNS算法分割时,更改分区的数量。段应该是在范围为1〜4。默认值是4。
-partition_limit int
通过限制一些宏块的比特的数量来降解质量。范围0(无降解,默认值)-100(全降解)。中等大小的图片,常用30-70。在VP8格式中,被称做控制区的限制为512k,并存储了以下信息:宏块是否可以跳过、所属的分段、能否被编码为4x4或16x16模式、以及用于每个子快的最后预测模式。对于一个非常大的图片,512k仅仅留出了每个16x16宏块的数位。最小绝对的宏块有4位。段和模式信息可以使用几乎所有这些4位(虽然是不太可能的情况下),对于大图片来说,这是一个非常棘手的问题。partition_limit参数控制着最昂贵的位模式(帧内4×4)将被使用的频率。这在512K的限制被到达时很有用,会显示以下消息:Error code: 6 (PARTITION0_OVERFLOW: Partition #0 is too big to fit 512k)。如果使用使用了该参数,且没有超过约束条件,则会使用更少的分段一次来减少每个宏块的头部信息位。参见 -segments 选项。
-size int
指定目标的大小(以字节为单位)、试图达到的压缩输出大小。压缩机会将局部编码尝试几遍不同的压缩,尽可能接近这一目标。
-psnr float
为压缩输出指定的PSNR(in dB),压缩机会将局部编码尝试几遍不同的压缩,尽可能接近这一目标。
-pass int
设置通过选项 -size 或者 -psnr 传递过来而采用二分法(选项 -size 或者 -psnr)过程中的最大次数。最大值为10。【have problem】
在使用选项-size和-psnr的二分法时设置一个最大的次数。
-crop x_position y_position width height
裁剪范围,从左上角的矩形顶点(坐标远点)开始计算,开始位置为坐标(x_position, y_position),裁剪大小为 宽为width、高为height,裁剪范围必须在源图片的矩形区域内。
-s width height
指定的输入文件的亮度平面尺寸。包括符合ITU-R BT.601建议的以4:2:0的线性格式的原始的Y'CbCr样例。
-map int
输出额外的ASCII的编码信息的映射。可能的映射值范围从1到6。这仅仅是为了帮助调试。
-pre int
指定一个预处理滤波器,此选项是一个占位符,目前没有任何效果。
-alpha_filter string
指定alpha平面的预测滤波方法。'none'、'fast'、'best',越来越复杂和缓慢。默认是'fast'。在内部实现上,alpha使用四种可能的预测(无,水平,垂直,梯度)进行过滤。 'fast'的模式将依次尝试每个模式,并挑选出尺寸较小的那个。'fast'模式将形成一个先验的猜测而没有测试所有的模式。
-alpha_method int
为alpha压缩指定算法:0 或者 1。算法0表示没有压缩,1 使用WebP无损压缩格式。默认值是1。
-alpha_cleanup
在完全透明的区域修改看不见的RGB,来完善可压缩性。默认是关闭此项功能的。
-noalpha
使用此选项将舍弃的alpha通道。
-lossless
无损压缩图片
-hint string
指定输入图像类型的值。可能的值包括:photo,picture,graph
-v 
打印额外的信息(特别是编码时间)。
-print_psnr
计算并报告平均PSNR(Peak-Signal-To-Noise ratio).
-print_ssim
计算并报告平均SSIM(structural similarity metric)
-progress
报告编码的百分比
-quiet
不打印任何东西
-short
仅打印用于测试目的的简要信息(输出文件的大小和PSNR)。

猜你喜欢

转载自blog.csdn.net/yang1226341090/article/details/80275821
今日推荐