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日,一大早,老闆急衝衝的打電話給韓梅梅。
李老闆:「全國網站都灰了,爲啥咱們本身的網站還這麼鮮豔。」
韓梅梅:「好多圖改不過來。」
李老闆:「原本你應該提早準備的。結果搞成如今這麼被動。
咱們是創業公司,每一個員工都應該是創業者。
做爲一個合格的創業者,要有遠見,有自驅,
不要什麼都不考慮,不要什麼都等安排。
若是你以爲本身不想當創業者,那就去找份大廠的工做。
若是你是個創業者,就拿出創業者的勁頭加個班搞定吧。」
還沒等韓梅梅回答,電話就被掛斷了。
複製代碼