用Python搞點事
圖片轉文字小工具
講者: 楊平
大綱
- 課程介紹
- 圖片檔概念
- PIL套件介紹
- 檔案讀寫
- 程式流程
- 實作
課程介紹
ASCII Art
本日目標
能學到什麼
- 圖片檔概念
- PIL套件基本使用方式
- 檔案讀寫
圖片檔概念
我有一張圖片
大小: 800 x 483
位元深度: 24
色彩模式: RGB
圖片大小
單位是像素(Pixel)
800 x 483
寬
高
總共有386400個像素
像素? 在哪?
像素裡面有甚麼
R: 94
G: 11
B: 141
01011110 00001011 10001101
位元深度: 8+8+8 bits
色彩模式
- RGB: 紅綠藍,每個顏色8bits(0~255)
- RGBA: RGB+Alpha(透明度),每色8bits
- CMYK: 青、洋紅、黃、黑,每色8bits
- 黑白: 1bits(1 or 0)
- 灰階: 一個8bits
- 索引色: 一個8bits,附上一個256色的顏色表
灰階
144
1001 0000
位元深度: 8 bits
PIL套件
PIL套件
PIL(Python Imagine Library)是一套處理圖片的Python套件
- 調整大小、色調、對比、亮度...
- 裁切圖片
- 旋轉圖片
- 加濾鏡
- 附加文字浮水印
- etc.
PIL套件
在Python中,套件指的是別人寫好的工具
我們可以透過API(Application Programming Interface)來使用這些工具
Theta = -90
PIL套件
from PIL import Image
img = Image.open('emoji1.png')
img = img.rotate(-90)
img.save('rotated.png')
背後的邏輯
img = img.rotate(-90)
API
檔案讀寫
檔案讀寫
- 開檔
txt = open('test.txt', 'w')
w: 寫
r: 讀
a: 寫,寫入的東西附加在檔案後面
w+: 讀加寫,檔案不存在則創一個新的
r+: 讀加寫,檔案不存在則報錯誤
a+: 讀加寫,寫入附加在檔案後面,檔案不存在則創一個新的
檔案讀寫
2. 寫檔
txt.write('哈囉你好 安安\n')
3. 關檔
txt.close()
程式流程
收到使用者輸入圖片檔名以及最大寬度之後:
1. 開啟圖片
2. 顯示圖片資訊(大小、檔案格式、色彩模式)
3. 判斷是否為RGB模式,不是則轉換成RGB
4. 調整圖片大小
5. 將圖片轉為黑白模式
6. 開檔
7. 讀取每個pixel的值:
是0的話填入"@"
是255的話填入"_"
8. 關檔
程式流程
實作
完整程式碼
安裝PIL套件
pip install pillow
確認有沒有安裝成功,打開交互模式,執行這行
>>> from PIL import Image
跑完後沒有錯誤就是成功
安裝指令
程式架構
from PIL import Image
def image_to_txt(imgName, maxSize):
pass
name = input('請輸入圖片檔案名稱(圖片需置於同一層資料夾): ')
maxSize = int(input('請輸入最大寬度(100~500): '))
if maxSize < 100 or maxSize > 500:
print('輸入錯誤')
else:
image_to_txt(name, maxSize)
print('程式結束')
引入PIL套件中的Image模組
建立image_to_txt函式,帶兩個參數,檔名以及最大寬度
提示使用者輸入資料,並呼叫image_to_txt函式
1. 開啟圖片
print("開啟圖片[{}]".format(imgName))
img = Image.open(imgName)
2. 顯示圖片資訊
print("圖片資訊: 大小為{}x{}, 格式為{}, 色彩模式為{}".format(\
img.size[0], img.size[1], img.format, img.mode))
img.size: 一個tuple,值為寬與高
img.format: 檔案格式的string
img.mode: 色彩模式的string
3. 判斷是否為RGB模式,
不是則轉換成RGB
if img.mode != 'RGB':
print("圖片顏色編碼不是RGB,進行轉換")
img = img.convert('RGB')
print("轉換完成")
4. 調整圖片大小
width = img.size[0]
height = img.size[1]
zoom = 0 # 縮小比率
if width >= maxSize:
zoom = width / maxSize
width = int(width / zoom)
height = int(height / zoom)
height = int(height / 2) # 除2讓比例看起來比較正確
img = img.resize((width, height))
print("圖片寬於{},已縮小為{}x{}".format(\
maxSize, img.size[0], img.size[1]))
2
1
5. 將圖片轉為黑白模式
img = img.convert('1')
6. 開檔
namestr = imgName.split('.')[0] + '.txt'
txt = open(namestr, 'w')
image.png
image.txt
imgName.split('.')
image
png
[0]
[1]
.txt
7. 讀取每個pixel的值
print()
print('開始進行圖片轉txt程序')
print('...')
for y in range(height):
for x in range(width):
pixel = img.getpixel((x, y))
if pixel != 0:
txt.write(' ')
else:
txt.write('@')
txt.write('\n')
_
_
_
_
_
@
@
@
@
@
@
@
@
@
8. 關檔
print('程序執行完成')
print('檔案儲存為[{}]'.format(namestr))
txt.close()
print('保存完成')
Thank for listening
填個問卷,讓我們更好
用Python搞點事1-圖片轉文字
By Sam Yang
用Python搞點事1-圖片轉文字
- 562