สร้างนามบัตรด้วย Python

Make Your Business Card with Python and Pillow Library (PIL Folk)

Athibet Prawane
odds.team
5 min readNov 10, 2023

--

ภาพต่อไปนี้คือนามบัตรที่ผมลองออกแบบด้วยมือแบบคร่าว ๆ ครับ ผมได้วางตำแหน่งและเลือกธีมสีไว้เรียบร้อย แต่ยังเหลือขั้นตอนสำคัญคือทำให้จินตนาการนี้ใช้งานได้จริง~

ในบทความนี้ มาดูวิธีแปลงภาพร่างใบนี้ให้เป็นนามบัตรที่ดูดีมีสไตล์ด้วย Python และ Pillow library หรือในอีกชื่อคือ PIL Folk (Python Image Library) กันครับ

🌍 Read this article in English

Prerequisites

  1. Install Python เวอร์ชัน 3+ ขึ้นไป
  2. Install Pillow (PIL Fork) library
pip install Pillow

Setting Up Python

ก่อนอื่นต้องสร้างไฟล์ Python (.py) ขึ้นมาก่อน เช่น card.py จากนั้น import modules ที่จำเป็นสำหรับการสร้างนามบัตร พร้อมกับเตรียม variables ข้อมูลบนนามบัตรไว้ก่อน

from PIL import Image, ImageDraw, ImageFont


name = "atb"
title = "DATA PRODUCT DEVELOPER"
phone = "+668 xxxx 1234"
email = "atb@example.com"
medium_url = "medium.com/atbb"
linkedin_url = "linkedin.com/in/athibet"
  • Image ใช้สำหรับการสร้าง, เปิด และจัดการรูปภาพ
  • ImageDraw ใช้สำหรับการเพิ่ม shapes, text และองค์ประกอบกราฟิกอื่น ๆ ให้กับรูปภาพ
  • ImageFont ใช้สำหรับจัดการ font

Preparing Fonts

เพื่อความสวยงามสามารถเลือกใช้ font ตามที่ต้องการได้ ผมใช้ font Lexend จาก Google Fonts ซึ่งได้ download มาเก็บไว้ใน folder ./fonts/ ที่อยู่ข้าง ๆ กับไฟล์ card.py

และเพื่อความเป็นระบบระเบียบ ผมกำหนด typography ด้วย ImageFont.truetype(…)ทั้งหมด 4 รูปแบบดังนี้ครับ

Typography
font_heading = ImageFont.truetype("fonts/Lexend-Bold.ttf", 80)
font_sub_heading = ImageFont.truetype("fonts/Lexend-Medium.ttf", 18)
font_body = ImageFont.truetype("fonts/Lexend-Regular.ttf", 14)
font_body_bold = ImageFont.truetype("fonts/Lexend-Bold.ttf", 14)

Drafting the Business Card

จากภาพร่างผมจะเริ่มสร้างโครงของนามบัตรก่อนโดยใช้ Image.new(…) ผมให้นามบัตรมีสีดำขนาดกว้าง 800 pixels และสูง 400 pixels

card_width = 800
card_height = 400
card = Image.new("RGB", (card_width, card_height), "black")

ลองดูภาพนามบัตรของเราด้วย card.show() จะได้นามบัตรตั้งต้นตามนี้

Adding Contents

หลังจากได้โครงของนามบัตรแล้ว เพิ่มข้อมูล name และ title เข้าไปที่ฝั่งซ้าย

การวาดข้อความจำเป็นต้องระบุตำแหน่ง pixel ในแกน (x, y) ให้ชัดเจน เช่น (60, 130) ซึ่งผมใช้เว็บ Pix Spy เพื่อประเมินตำแหน่งของ pixel คร่าว ๆ ครับ

พอได้ตำแหน่งแล้วก็เตรียมการวาดของลงไปในภาพด้วย ImageDraw.Draw(…)

จากนั้นเริ่มวาดข้อความด้วย .text(…) พร้อมกำหนด dimension (x, y), ข้อความ, สีตัวอักษร (fill) และ font

draw = ImageDraw.Draw(card)

# Add left contents
draw.text((60, 130), name, fill="white", font=font_heading)
draw.text((60, 220), title, fill="white", font=font_sub_heading)

เพิ่มข้อมูลการติดต่อ phone, email, medium_url, linkedin_url ที่ฝั่งขวา

# Add right contents -[1]- `text`
draw.text((454, 160), f"t. {phone}", fill="white", font=font_body)
draw.text((454, 180), f"e. {email}", fill="white", font=font_body)
draw.text((454, 200), f"m. {medium_url}", fill="white", font=font_body)
draw.text((454, 220), f"l. {linkedin_url}", fill="white", font=font_body)

ข้อมูลการติดต่อทั้ง 4 บรรทัดนี้ สามารถใช้draw.text_multiline(…) แทนการใช้ draw.text()ได้ แต่ต้องเพิ่ม \n ลงไปในข้อความเพื่อระบุการขึ้นบรรทัดใหม่

# Add right contents -[1]- `text`
# draw.text((454, 160), f"t. {phone}", fill="white", font=font_body)
# draw.text((454, 180), f"e. {email}", fill="white", font=font_body)
# draw.text((454, 200), f"m. {medium_url}", fill="white", font=font_body)
# draw.text((454, 220), f"l. {linkedin_url}", fill="white", font=font_body)

# Add right contents -[2]- `multiline_text`
draw.multiline_text(
(454, 160),
f"t. {phone}\ne. {email}\nm. {medium_url}\nl. {linkedin_url}",
fill="white",
font=font_body,
spacing=6,
)

สำหรับส่วนสุดท้ายผมจะใช้ภาพ contact QR code จากเว็บ The QR Code Generator โดยเปิดภาพด้วย Image.open(…) แล้วเอามาวางใส่นามบัตรด้วย .paste(…) (QR code เป็นสีขาว)

ถ้าลองใช้ .size() เพื่อดูขนาดของ QR Code จะพบว่ามีขนาดใหญ่เกินไป สามารถปรับขนาด QR Code ให้มีขนาดที่เหมาะสมด้วย .resize(…) ได้

qr_code = Image.open("qr-code.png").resize((80, 80))
card.paste(qr_code, (660, 160), qr_code)

ถึงตรงนี้ก็จะได้นามบัตรที่มีข้อมูลต่าง ๆ ครบถ้วนแล้ว

Enhancing the Design

ถึงแม้นามบัตรจะพร้อมใช้งานแล้ว ลองปรับแต่งอีกสักนิดเพื่อให้สวยงามมากยิ่งขึ้น เช่น

ลองเพิ่มเส้นเล็ก ๆ ที่หน้า title เพื่อดึงจุดสนใจให้ฝั่งซ้าย

draw.text((60, 130), name, fill="white", font=font_heading)
draw.line((64, 224, 64, 237), fill="green", width=4) # Add a green line
draw.text((72, 220), title, fill="white", font=font_sub_heading) # Adjust the position

ลองจัด alignment ให้ข้อมูลติดต่อฝั่งขวาเพื่อความเป็นระเบียบมากขึ้น

# Add right contents -[1]- `text`
# draw.text((454, 160), f"t. {phone}", fill="white", font=font_body)
# draw.text((454, 180), f"e. {email}", fill="white", font=font_body)
# draw.text((454, 200), f"m. {medium_url}", fill="white", font=font_body)
# draw.text((454, 220), f"l. {linkedin_url}", fill="white", font=font_body)

# Add right contents -[2]- `multiline_text`
# draw.multiline_text(
# (454, 160),
# f"t. {phone}\ne. {email}\nm. {medium_url}\nl. {linkedin_url}",
# fill="white",
# font=font_body,
# spacing=6,
# )

# Add right contents -[3]- `multiline_text` + alignment
contact_prepends = ["t.", "e.", "m.", "l."]
draw.multiline_text(
(454, 160),
"\n".join(contact_prepends),
fill="green",
font=font_body_bold,
spacing=6,
)
contact_texts = [phone, email, medium_url, linkedin_url]
draw.multiline_text(
(476, 160),
"\n".join(contact_texts),
fill="white",
font=font_body,
spacing=6,
)

Saving the Business Card

เมื่อนามบัตรเสร็จแล้ว ก็ถึงเวลาบันทึกเป็นไฟล์รูปภาพไปใช้งาน

card.save("card.png")

สามารถเลือก format รูปภาพแบบต่าง ๆ ได้ตามต้องการ เช่น PNG, JPEG หรือ PDF

Final Code

from PIL import Image, ImageDraw, ImageFont


# Define the contact information
name = "atb"
title = "DATA PRODUCT DEVELOPER"
phone = "+668 xxxx 1234"
email = "atb@example.com"
medium_url = "medium.com/atbb"
linkedin_url = "linkedin.com/in/athibet"

# Define fonts
font_heading = ImageFont.truetype("fonts/Lexend-Bold.ttf", 80)
font_sub_heading = ImageFont.truetype("fonts/Lexend-Medium.ttf", 18)
font_body = ImageFont.truetype("fonts/Lexend-Regular.ttf", 14)
font_body_bold = ImageFont.truetype("fonts/Lexend-Bold.ttf", 14)

# Create a blank business card
card_width = 800
card_height = 400
card = Image.new("RGB", (card_width, card_height), "black")

# Create a drawing context
draw = ImageDraw.Draw(card)

# Add left contents
draw.text((60, 130), name, fill="white", font=font_heading)
draw.line((64, 224, 64, 237), fill="green", width=4)
draw.text((72, 220), title, fill="white", font=font_sub_heading)

# Add right contents
contact_prepends = ["t.", "e.", "m.", "l."]
draw.multiline_text(
(454, 160),
"\n".join(contact_prepends),
fill="green",
font=font_body_bold,
spacing=6,
)
contact_texts = [phone, email, medium_url, linkedin_url]
draw.multiline_text(
(476, 160),
"\n".join(contact_texts),
fill="white",
font=font_body,
spacing=6,
)

# Paste QR Code
qr_code = Image.open("qr-code.png").resize((80, 80))
card.paste(qr_code, (660, 160), qr_code)

# Save the business card
card.save("card.png")

Conclusion

สำหรับเนื้อหาในบทความนี้ ก็จะเป็นการเดินทางเพื่อสร้างนามบัตรโดยใช้ Python และ Pillow library ตั้งแต่ ขึ้นโครง, เตรียม font typography, วาดข้อความ, วางรูปภาพ, วาดเส้น จนได้นามบัตรที่สามารถ save ไปใช้จริงได้

จะเห็นว่า Pillow เป็นเครื่องมือที่น่าสนใจและใช้งานง่าย เป็นเครื่องมือที่ถูกพัฒนาขึ้นเพื่อการทำ image processing โดยเฉพาะ ยังมีอีกหลายความสามารถที่ยังไม่ได้ใช้ในบทความนี้ หากสนใจสามารถศึกษาเพิ่มเติมได้ที่

--

--