2020年4月4日,一大早,老板急冲冲的打电话给韩梅梅。python
李老板:“全国网站都灰了,为啥咱们本身的网站还这么鲜艳。”git
韩梅梅:“好多图改不过来。”github
李老板:“原本你应该提早准备的。结果搞成如今这么被动。 咱们是创业公司,每一个员工都应该是创业者。 做为一个合格的创业者,要有远见,有自驱, 不要什么都不考虑,不要什么都等安排。web
若是你以为本身不想当创业者,那就去找份大厂的工做。 若是你是个创业者,就拿出创业者的劲头加个班搞定吧。”算法
还没等韩梅梅回答,电话就被挂断了。markdown
韩梅梅心里是崩溃的,只好找李雷去诉苦。函数
李雷:“别担忧梅梅,包在我身上。我早就想到如何应对大批量改图的紧急状况,因此我准备了一个命令行处理图片的工具。还写了文章《一行命令PS你的图片》,只不过尚未加变灰的功能”工具
因而李雷开始忙碌起来,首先打开EzPP的源码考虑怎样添加批量事图片变灰的功能。oop
可不能够用现有的recolor功能,传递一个灰色的颜色呢?post
李雷作了个实验
ezpp recolor -i docs/icon.png -c '#999999'
复制代码
发现结果不是想要的,图片变红了。
原图 | -c 999999 |
---|---|
![]() |
![]() |
为何呢?原来ezpp recolor功能,目前的算法是这样的:
先将-c后面的颜色参数转化成HSV(Hue,Saturation,Value)数值,
而后,用这里面的Hue,替换图片的每一个像素的HSV中的Hue,
再将每一个像素的新HSV值转化为色值保存。
Hue 是色相,Saturation是饱和度,Value是亮度
想要使图像变灰,修改Hue是不管如何也办不到的。只能改饱和度
当灰色的色值被转成HSV的时候,灰色是没有对应的色相(Hue)的,所以色相会被转成默认值0,也就是红色。
看来须要专门添加一个灰度调节功能了。
让用户能够直接调整HSV。
好比输入这样的命令
ezpp recolor -i docs/test.jpg -s 0.5
复制代码
获得这样的结果
原图 | 饱和度变化 -0.5 |
---|---|
![]() |
![]() |
有了算法代码就好实现了:
def deta_float(origin, deta):
return max(min(origin + deta, 1.0), 0.0)
def recolor_hsv(filename, outfile, dst_h, dst_s, dst_v):
# name of new file
# 肯定用什么样的文件名来保存图片
new_filename = outfile
if outfile == None:
bar_filename, ext = os.path.splitext(filename)
print(f"dst_h:{dst_h}, dst_s:{dst_s}, dst_v:{dst_v}")
hsv_name = f"_h({dst_h})" if dst_h != None else f""
hsv_name += f"_s({dst_s})" if dst_s != None else f""
hsv_name += f"_v({dst_v})" if dst_v != None else f""
new_filename = f"{bar_filename}{hsv_name}{ext}"
print(f"{filename} + hsv{hsv_name} -> {new_filename}")
# load pixel from image.
# 打开图片,加载像素值
with open(filename, 'rb') as imgf:
img = Image.open(imgf).convert('RGBA')
width = img.width
height = img.height
px = img.load()
# new file to save result of recolor
# 创造一个新图片用来保存变换结果
img_new = Image.new('RGBA', (width, height))
px_new = img_new.load()
# recolor every pixel
# 逐个像素变换
for y in range(0, height):
for x in range(0, width):
r, g, b, a = px[x, y]
h, s, v = colorsys.rgb_to_hsv(r/255, g/255, b/255)
new_s = s if r == g and g == b else (
deta_float(s, float(dst_s)) if dst_s != None else s
)
rn, gn, bn = colorsys.hsv_to_rgb(
float(dst_h)/float(360) if dst_h != None else h,
new_s,
deta_float(v, float(dst_v)) if dst_v != None else v)
px_new[x, y] = (int(255*rn), int(255*gn), int(255*bn), a)
# RGBA for png ,And RGB for other ext
# 若是输入文件是PNG保留RGBA格式,其余文件使用RGB格式。
if ext.lower == '.png':
img_new.save(new_filename)
else:
img_new.convert('RGB').save(new_filename)
复制代码
效果以下:
饱和度变化 | 效果 |
---|---|
原图 | ![]() |
s=1 | ![]() |
s=0.5 | ![]() |
s=0.3 | ![]() |
s=0.1 | ![]() |
s=0(原图) | ![]() |
s=-0.1 | ![]() |
s=-0.3 | ![]() |
s=-0.5 | ![]() |
s=-1 | ![]() |
若是想把任意图片变成灰度图只要将其饱和度-1.0就能够了。
ezpp recolor -i playground/test.jpg -s 1.0
复制代码
可是韩梅梅须要的是全站图片都变灰呀。 李雷又加了一个遍历工程下全部图片的参数。
-r
当用户传递了参数-r的时候,经过这个函数遍历目录,找出全部图片文件而后处理。
def get_recursive_pic_infiles(indir):
file_exts = ['jpeg', 'jpg', 'png', 'webp', 'JPEG', 'JPG', 'PNG', 'WEBP']
paths = []
for file_ext in file_exts:
type_filter_str = os.path.join(
f'{indir}', f'**/*.{file_ext}')
picfiles = glob.glob(type_filter_str, recursive=True)
paths.extend(picfiles)
return paths
复制代码
当看到整个网站的全部图片都变灰的那一刻,韩梅梅热泪盈眶...
若是想要深刻了解EzPP,能够看官方文档完整源码 EzPP@github
李雷通过一个月的奋战,终于完成了一个flutter应用的开发。
打算上线了才发现,图标仍是flutter自带的图标呢,赶忙向设计师韩梅梅求救。
设计师韩梅梅拿出准备已久的Logo丢给李雷,李雷傻眼了。
李雷:“怎么只有一个?”
韩梅梅:“难道安卓和iOS要用不一样的图标?”
李雷:“不是啊。一样的图标不一样的尺寸。
安卓图标五六个 ,iOS图标十几个吧。
我给你列个列表吧,尺寸都告诉你。你帮忙resize一下吧。”
韩梅梅:”宝宝内心苦...“
李雷:“嗯,我想一想办法吧...”
复制代码
书接上回
看到工程师李雷能用一行命令,更新flutter工程下全部图标,
韩梅梅深入的体会到,这(zhe)门(ge)语(nan)言(ren)如此优秀,必定不能错过。
因而找到李雷:
韩梅梅:“李雷,上次见到你用python更新图标,感受好棒啊”
李雷:“Python确实是很好用的”
韩梅梅:“我能学会吗”
李雷:“有我在,怎么可能学不会呢?咱们先从最简单的Hello world开始吧”
......
复制代码
学完python3中f-string 格式化固定宽度的数字,
李雷如约上门安装安装python,折腾了很大一通李雷和韩梅梅都感受很累。
因而李雷提议到公园玩耍,他提早作足了功课,
学习了不少拍照到知识,终于用上了,尤为是构图比例,一概黄金分割。 ...
复制代码
通过上次的授课经历,李雷发觉,韩梅梅对图形绘制这块很感兴趣。
因而绞尽脑汁,谷歌百度,寻找各类素材。通过反复实验终于完成了备课工做。
因而乎掰着手指头,从周一盼到了周六。
“梅梅,咱们先看一个神奇的公式,以及如何用python实现它”
复制代码
2020年4月4日,一大早,老板急冲冲的打电话给韩梅梅。
李老板:“全国网站都灰了,为啥咱们本身的网站还这么鲜艳。”
韩梅梅:“好多图改不过来。”
李老板:“原本你应该提早准备的。结果搞成如今这么被动。
咱们是创业公司,每一个员工都应该是创业者。
做为一个合格的创业者,要有远见,有自驱,
不要什么都不考虑,不要什么都等安排。
若是你以为本身不想当创业者,那就去找份大厂的工做。
若是你是个创业者,就拿出创业者的劲头加个班搞定吧。”
还没等韩梅梅回答,电话就被挂断了。
复制代码