五分鍾30行代碼使用Python制作熊貓表情包(圖片字符化)(附有源碼逐行分析)


@

一.Demo

相信許多的小伙伴在平時玩QQ的時候都有發過這樣一張表情包,如下:
在這里插入圖片描述
它其實是由下面的一張表情包演化而來。
在這里插入圖片描述
今天我們就來教大家如何制作它。

二.程序演示加講解

# coding=utf-8
from PIL import Image
import argparse

#----------------------------------------------#
#命令行輸入參數處理
#----------------------------------------------#

#構建命令行輸入參數處理ArgumentParser實例
parser = argparse.ArgumentParser()

#輸入文件
parser.add_argument('file', default='D:/課程/python/image/myimage1.jpg')

#輸出文件
parser.add_argument('--output', default=0)

#輸出文件的寬
parser.add_argument('--width', type=int, default=80)
#輸出文件的高
parser.add_argument('--height', type=int, default=80)


#-----------------------------------------------#
# 獲取參數
#-----------------------------------------------#

#解析並獲取參數
args = parser.parse_args()

#輸入的圖片路徑
IMG = args.file
#輸入的圖片寬度
WIDTH = args.width
#輸入的圖片高度
HEIGHT = args.height
#輸出字符畫的路徑
OUTPUT = args.output

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'.")

#----------------------------------------------#
#將256灰度映射到70個字符上
#----------------------------------------------#
def get_char(r, g, b, alpha=256):
    if alpha == 0:
        return ' '
    length = len(ascii_char)
    
    #RGB轉灰度值
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)

    unit = (256.0 + 1) / length
    return ascii_char[int(gray / unit)]


if __name__ == '__main__':
    rgb_im = Image.open(IMG)
    im = rgb_im.convert('RGB')
    im = im.resize((WIDTH, HEIGHT), Image.NEAREST)
    txt = ""

    for i in range(HEIGHT):
        for j in range(WIDTH):
            txt += get_char(*im.getpixel((j, i)))
        txt += '\n'
    print(txt)

我們在Pycharm中的Terminal,先進入我們項目所在地,然后輸入如下命令進行傳參運行。

python 01.py D:/課程/python/image/myimage1.jpg --output=0 --width=45 --height=20

在這里插入圖片描述
我們就能將我們的圖片數字化。
下面是博主親自實驗得出的圖片:
在這里插入圖片描述

三.分析程序

補充的知識:

灰度值:指黑白圖像中點的顏色深度,范圍從0到255,白色為255,黑色為0,所以黑白圖片也稱灰度圖像。

RGB:red,green,blue,三原色,人們日常所能看到的顏色都是由三原色組成

我們的實驗原理就是將RGB值映射到灰度值上

我們建立一張列表,灰度值小的在列表的開頭,灰度值大的作為列表的結尾。這樣就能建立起原圖與數字化圖片之間的聯系。

(1)主函數:

Image.open(file)

返回一張圖片,file為文件存儲路徑

rgb_im.convert(mode)

返回一張圖片,圖片經過格式轉換,mode為一種顏色轉換模板。
(其他參數,dither:控制顏色抖動,palette:調動調色板,Color:控制調色板的顏色數目,最大有256種)

im.resize(size, filter)

返回一張圖片,變量size是所要求的尺寸,是一個二元組:(width, height)。變量filter為NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者圖像模式為“1”或者“P”,該變量設置為NEAREST。

(2)RGB轉灰度值

alpha=0 表示空白
最大為alpha = 255

(3)灰度值轉換成字符

im.getpixel((j,i)) 獲取得到坐標 (j,i) 位置的 RGB 像素值(但是有的時候會包含 alpha 值),返回的結果是一個元組.* 可以將元組作為參數傳遞給 get_char,同時元組中的每個元素都對應到 get_char 函數的每個參數。

(4)當然,如果我們想要以文件的形式輸出,可以加入使用下面的程序

    if OUTPUT:
        with open(OUTPUT, 'w') as f:
            f.write(txt)
    else:
        with open("output.txt", 'w') as f:
            f.write(txt)

四.注意事項

我們在用命令行運行程序的時候,不能寫入file=,當然,也不能寫成文件路徑帶有雙引號或者單引號,參數之間用空格鍵隔開。
在這里插入圖片描述

五.程序的改進

我們可以通過改變ascii_char的值,來改變我們的程序,使得效果最佳。
小技巧:我們可以使得相同或相近的顏色區域字符相同,這樣能得到好的效果。如下:
在這里插入圖片描述

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM