top of page

ทำงานกับข้อมูลรูปภาพด้วย Pillow

Updated: Aug 15, 2021

นำภาพมาต่อกัน และเปลี่ยนสีภาพ ด้วย Pillow เรียนรู้หลักการทำงานกับรูปด้วย Python กับ Ultimate Python


ส่วนประกอบของรูปภาพ

ประกอบด้วยส่วนย่อยที่เรียกว่า pixel ที่แสดง 1 สี เมื่อนำ pixel มาเรียงกันจำนวนมากจึงเกิดเป็นรูปภาพขึ้นมา และคอมพิวเตอร์ก็ทำความเข้าใจรูปภาพผ่านโครงสร้าง pixel ในภาพ ซึ่งในบทเรียนนี้เราจะใช้ libray Pillow เพื่อใช้ทำความเข้าใจรูปภาพกัน

ติดตั้งเครื่องมือ

ผ่านคำสั่ง pip install โดย library pillow จะใช้ชื่อ Pillow ในการดาวน์โหลด


In [1]:
!pip install Pillow
Requirement already satisfied: Pillow in c:\users\acer\anaconda3\lib\site-packages (7.2.0) 

นำเข้าเครื่องมือ

ผ่านคำสั่ง import โดย pillow จะใช้ชื่อ PIL ในการเรียกใช้งาน หากต้องการคำสั่งใดโดยเฉพาะสามารถใช้คำสั่ง from PIL import ตามด้วยชื่อคำสั่งทีต้องการเพื่อนำเข้าคำสั่งแบบเจาะจงได้ด้วย

เราจะใช้คำสั่ง Image จาก pillow เพื่อใช้ทำงานกับรูป สามารถนำเข้าคำสั่ง Image จาก PIL ได้ดังนี้


In [2]:
from PIL import Image

เปิดไฟล์รูป

ใช้คำสั่ง Image.open() และระบุ path ของไฟล์ที่ต้องการ เรียนรู้เกี่ยวกับการระบุได้ที่นี่ ในกรณีรูปภาพอยู่ที่ directory ปัจจุบันสามารถใช้ชื่อพร้อมนามสกุลไฟล์เป็นตัวระบุ path file ได้ทันทีตามตัวอย่างต่อไปนี้

เปิดไฟล์ .png

การเปิดไฟล์ด้วย .open() จะทำการคัดลอกข้อมูลจากรูปและสร้าง object ประเภท PngImageFile เพื่อทำงานกับ Python เช่นการเปิดไฟล์ youtube-cover-1.png


In [3]:
png_file = Image.open('youtube-cover-1.png')

เช็คประเภทข้อมูลด้วย type()


In [5]:
type(png_file)
Out[5]:
PIL.PngImagePlugin.PngImageFile

ไฟล์รูปมีหลายประเภท

และ แต่ละประเภทจะถูกสร้างขึ้นเป็น object คนละประเภทกัน ซึ่งใน PIL ไฟล์รูป .png จะถูกสร้างขึ้นเป็น object PngImageFile .jpg จะถูกสร้างขึ้นเป็น object JpegImageFile ดังนั้นต้องระวังการทำงานของแต่ละประเภทข้อมูล แต่ในขณะเดียวกันสำหรับ PIL หลายๆ คำสั่งก็ถูกสร้างไว้ในชื่อเดียวกัน และทำงานแบบเดียวกันในหลายประเภท object

เปิดไฟล์ .jpg

ใช้คำสั่ง .open() ในลักษณะเดียวกับการใช้เปิดไฟล์ .png แต่ความแตกต่างอยู่ที่ object ที่ใช้เก็บค่าที่ได้จากไฟล์ .jpg เช่น การเปิดไฟล์ youtube-cover-2.jpg


In [6]:
jpg_file = Image.open('youtube-cover-2.jpg')

ใช้ type เช็คประเภท


In [8]:
type(jpg_file)
Out[8]:
PIL.JpegImagePlugin.JpegImageFile

ขนาดของภาพ

ดูได้จาก attribute .size จาก object PngIamgefile, JpegImageFile ซึ่งจะได้ ขนาด ความกว้าง และความยาว ที่เก็บไว้ใน tuple ตามลำดับ เช่น การดูขนาดใน png_file ที่สร้างขึ้นก่อนหน้านี้


In [9]:
png_file.size
Out[9]:
(1600, 900)

การระบุตำแหน่งบนภาพ

ภาพจะประกอบไปด้วยส่วนย่อยที่ pixel สี เรียงกันจนเกิดเป็นรูปซึ่งการระบุตำแหน่งบนภาพจะใช้ตำแหน่งของ pixel ที่ระบุเป็นพิกัด (x,y) ซึ่ง มีจุดกำเนิด (0,0) ที่มุมซ้ายบนของภาพ และ pixel ถัดไปทางขวาจะมีค่า x เพิ่มขึ้นทีละ 1 ส่วน pixel ที่ถัดลงมาด้านล่างจะมีค่า y เพิ่มขึ้นทีละ 1

Box Tuple

เป็นการระบุพื้นที่บนรูปที่ใช้กับการทำงานกับ PIL ผ่านใช้ tuple ที่ระบุตำแหน่ง 4 ตำแหน่ง ในลักษณะดังนี้ (Left, Top, Right, Bottom) Left พิกัด x ที่ขอบกรอบ ที่มีค่าน้อยที่สุด Top พิกัด y ที่ขอบกรอบ ที่มีค่าน้อยที่สุด Right พิกัด x ที่ขอบกรอบ ที่มีค่ามากที่สุด Bottom พิกัด y ที่ขอบกรอบ ที่มีค่าน้อยที่สุด

เช่น การระบุ Box Tuple ที่ระบุพื้นที่ทั้งหมดบนรูปที่มีขนาด กว้าง * สูง 1600 * 900 สามารถเขียนได้ลักษณะดังนี้


In [10]:
(0,0,1600,900)
Out[10]:
(0, 0, 1600, 900)

การ crop ภาพ

ใช้คำสั่ง .crop() กับ object ที่ได้จากการเปิดไฟล์ภาพ ซึ่งใช้การระบุ box tuple สำหรับพื้นที่ในตำแหน่งที่ต้องการ

png .crop()


In [11]:
ig_cover_png = png_file.crop((350,0,1250,900))

jpg .crop()


In [12]:
ig_cover_jpg = jpg_file.crop((350,0,1250,900))

สร้างภาพเปล่า

ผ่านคำสั่ง .new() ซึ่งเป็นการสร้าง object ที่จะบันทึกออกไปเป็นไฟล์ภาพอีกที โดยการใส่โหมดการทำงาน 'RGBA' หรืออื่นๆ และ ขนาดรูปที่ต้องการที่ประกอบด้วย ความกว้าง และ ความยาว ตามลำดับ เป็น tuple


In [13]:
banner = Image.new('RGBA',(1800,900))

นำภาพที่ต้องการมาแปะ

ผ่านคำสั่ง .paste() ที่รับค่าเป็น object ของรูปที่นำมาแปะ และ box tuple โดยใส่ค่า left และ top


In [14]:
banner.paste(ig_cover_png,(0,0))
In [15]:
banner.paste(ig_cover_jpg,(900,0))

ระบบสี RGBA

ย่อมาจาก Red Green Blue Alpha ซึ่งเป็นค่าที่ถูกเก็บไว้ใน 1 pixel ในการใช้งานจะใช้โครงสร้าง tuple และนำไปใช้เพื่อใช้แสดงค่าสีต่างๆ โดยมีค่าน้อยที่สุดคือ 0 และมากที่สุด 255 โดย Red เก็บค่าสีแดง Green เก็บค่าสีเขียว Blue เก็บค่าสีน้ำเงิน Alpha เก็บค่าการแสดงสี โดย Alpha=0 คือไม่แสดงสี หรือโปร่งแสง


In [17]:
(255,0,0,255)
Out[17]:
(255, 0, 0, 255)

pixel จากภาพ

สามารถดึงได้โดยคำสั่ง .getpixel() ที่ใช้งานกับ object ของภาพ โดยรับค่า tuple ที่ระบุตำแหน่ง x,y ของ pixel ที่สนใจตามลำดับ ซึ่ง pixel ก็คือค่าสีต่างๆ ในระบบ RGBA นั่นเอง


In [18]:
ig_cover_png.getpixel((0,0))
Out[18]:
(243, 240, 228, 255)

pixel จากภาพ

สามารถดึงได้โดยคำสั่ง .getpixel() ที่ใช้งานกับ object ของภาพ โดยรับค่า tuple ที่ระบุตำแหน่ง x,y ของ pixel ที่สนใจตามลำดับ ซึ่ง pixel ก็คือค่าสีต่างๆ ในระบบ RGBA นั่นเอง


In [19]:
new_cover = Image.new('RGBA',(900,900))

นำ pixel ใส่ในภาพ

สำหรับการนำ pixel ใส่ในภาพ เราจะใช้คำสั่ง .putpixel() ที่รับค่า (x,y) และ pixel ที่เป็น tuple ค่าสี RBGA เช่น การใส่ pixel สีแดงลงไปใน blank_png เขียนได้ดังนี้


In [20]:
new_cover.putpixel((0,0),(255,0,0,255))

for loop และ pixel จากภาพ


In [22]:
for x in range(0,900):
 for y in range(0,900):
 pixel = ig_cover_png.getpixel((x,y))
 new_cover.putpixel((x,y),(pixel[0],0,0,255))

การบันทึกภาพ

ใช้คำสั่ง .save() กับ object ที่ได้จากรูปภาพ และใส่ path ชื่อไฟล์ และนามสกุลไฟล์ที่ต้องการบันทึกออกไป


In [24]:
ig_cover_png.save('ig-cover-1.png')
In [25]:
banner.save('banner.png')
In [26]:
new_cover.save('new-ig-cover-1.png')

เสร็จสิ้นการทำงานกับรูปภาพด้วย Pillow

ข้ากลุ่มแลกเปลี่ยนความรู้


เรียนเรียน Python จาก 0 ฉบับวัยทำงานยุคใหม่

เริ่มไว ใช้ได้ทันที พร้อมการดูแลจากผู้สอนโดยตรง และกลุ่มแลกเปลี่ยนความรู้

เรียนรู้เกี่ยวกับคอร์สเรียนเพิ่มเติม https://ultimatepython.teachable.com/p/python-automation




3,749 views0 comments
bottom of page