韓梅梅學Python之四:一行命令,圖片全灰

2020年4月4日,一大早,老闆急衝衝的打電話給韓梅梅。python

李老闆:「全國網站都灰了,爲啥咱們本身的網站還這麼鮮豔。」git

韓梅梅:「好多圖改不過來。」github

李老闆:「原本你應該提早準備的。結果搞成如今這麼被動。 咱們是創業公司,每一個員工都應該是創業者。 做爲一個合格的創業者,要有遠見,有自驅, 不要什麼都不考慮,不要什麼都等安排。web

若是你以爲本身不想當創業者,那就去找份大廠的工做。 若是你是個創業者,就拿出創業者的勁頭加個班搞定吧。」算法

還沒等韓梅梅回答,電話就被掛斷了。markdown

韓梅梅心裏是崩潰的,只好找李雷去訴苦。函數

李雷:「別擔憂梅梅,包在我身上。我早就想到如何應對大批量改圖的緊急狀況,因此我準備了一個命令行處理圖片的工具。還寫了文章《一行命令PS你的圖片》,只不過尚未加變灰的功能」工具

因而李雷開始忙碌起來,首先打開EzPP的源碼考慮怎樣添加批量事圖片變灰的功能。oop

可不能夠用現有的recolor功能,傳遞一個灰色的顏色呢?post

李雷作了個實驗

ezpp recolor -i docs/icon.png -c '#999999'
複製代碼

發現結果不是想要的,圖片變紅了。

原圖 -c 999999
原圖 s-=0.5

爲何呢?原來ezpp recolor功能,目前的算法是這樣的:

先將-c後面的顏色參數轉化成HSV(Hue,Saturation,Value)數值,

而後,用這裏面的Hue,替換圖片的每一個像素的HSV中的Hue,

再將每一個像素的新HSV值轉化爲色值保存。

Hue 是色相,Saturation是飽和度,Value是亮度

HSV模型

想要使圖像變灰,修改Hue是不管如何也辦不到的。只能改飽和度

當灰色的色值被轉成HSV的時候,灰色是沒有對應的色相(Hue)的,所以色相會被轉成默認值0,也就是紅色。

看來須要專門添加一個灰度調節功能了。

讓用戶能夠直接調整HSV。

好比輸入這樣的命令

ezpp recolor -i docs/test.jpg -s 0.5
複製代碼

獲得這樣的結果

原圖 飽和度變化 -0.5
原圖 s-=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+=1
s=0.5 s+=0.5
s=0.3 s+=0.3
s=0.1 s+=0.1
s=0(原圖) 原圖
s=-0.1 s-=0.1
s=-0.3 s-=0.3
s=-0.5 s-=0.5
s=-1 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


所有故事:

韓梅梅學python之序章:一行命令,更新flutter工程下全部圖標

李雷通過一個月的奮戰,終於完成了一個flutter應用的開發。
打算上線了才發現,圖標仍是flutter自帶的圖標呢,趕忙向設計師韓梅梅求救。
設計師韓梅梅拿出準備已久的Logo丟給李雷,李雷傻眼了。
李雷:「怎麼只有一個?」
韓梅梅:「難道安卓和iOS要用不一樣的圖標?」
李雷:「不是啊。一樣的圖標不一樣的尺寸。
      安卓圖標五六個 ,iOS圖標十幾個吧。
      我給你列個列表吧,尺寸都告訴你。你幫忙resize一下吧。」
韓梅梅:」寶寶內心苦...「
李雷:「嗯,我想一想辦法吧...」
複製代碼

韓梅梅學python之一:python3中f-string 格式化固定寬度的數字

書接上回
看到工程師李雷能用一行命令,更新flutter工程下全部圖標,
韓梅梅深入的體會到,這(zhe)門(ge)語(nan)言(ren)如此優秀,必定不能錯過。
因而找到李雷:
韓梅梅:「李雷,上次見到你用python更新圖標,感受好棒啊」
李雷:「Python確實是很好用的」
韓梅梅:「我能學會嗎」
李雷:「有我在,怎麼可能學不會呢?咱們先從最簡單的Hello world開始吧」
......
複製代碼

韓梅梅學python之二:黃金分割和五角星

學完python3中f-string 格式化固定寬度的數字,
李雷如約上門安裝安裝python,折騰了很大一通李雷和韓梅梅都感受很累。
因而李雷提議到公園玩耍,他提早作足了功課,
學習了不少拍照到知識,終於用上了,尤爲是構圖比例,一概黃金分割。 ...
複製代碼

韓梅梅學Python之三:斐波那契

通過上次的授課經歷,李雷發覺,韓梅梅對圖形繪製這塊很感興趣。
因而絞盡腦汁,谷歌百度,尋找各類素材。通過反覆實驗終於完成了備課工做。
因而乎掰着手指頭,從週一盼到了週六。
「梅梅,咱們先看一個神奇的公式,以及如何用python實現它」
複製代碼

韓梅梅學Python之四:一行命令,圖片全灰

2020年4月4日,一大早,老闆急衝衝的打電話給韓梅梅。

李老闆:「全國網站都灰了,爲啥咱們本身的網站還這麼鮮豔。」

韓梅梅:「好多圖改不過來。」

李老闆:「原本你應該提早準備的。結果搞成如今這麼被動。
咱們是創業公司,每一個員工都應該是創業者。
做爲一個合格的創業者,要有遠見,有自驅,
不要什麼都不考慮,不要什麼都等安排。

若是你以爲本身不想當創業者,那就去找份大廠的工做。
若是你是個創業者,就拿出創業者的勁頭加個班搞定吧。」

還沒等韓梅梅回答,電話就被掛斷了。
複製代碼
相關文章
相關標籤/搜索