用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

檔案讀寫

檔案讀寫

  1. 開檔
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

填個問卷,讓我們更好

https://forms.gle/5LMKrEwT1nVFGHAN8

Made with Slides.com