Tags:
Node Thumbnail

พอดีมีเรื่องจำเป็นต้องจัดการกับรูปภาพนิดหน่อย ดูเหมือนงานจะง่ายๆ แต่ออกจะกินแรงอยู่ไม่น้อย ปัญหาคือว่า มีรูปขนาด 13500 x 13500 pixel อยู่รูปหนึ่ง ต้องการหั่นเป็นรูปย่อยๆ รูปละ 1350 x 900 ดังนั้นก็จะได้รูปออกมา 10 x 15 = 150 รูป นอกจากนี้แต่ละรูป จะต้องใส่ขอบขาวเข้าไปด้านขวา และใส่ตัวเลขเข้าไปเพื่อบอกว่าเป็นรูปหมายเลขที่เท่าไหร่ โดยเป็นตัวเลขสองตัว ตั้งแต่รูปซ้ายบนสุด (0,0) จนถึงขวาล่างสุด (9, 14) เพื่อที่จะเอารูปไปอัดจากร้าน แล้วเอามาเรียงกลับเป็นอย่างเดิมทีหลังได้โดยไม่งง

ของแบบนี้จะให้ใช้ The GIMP หรือ Photoshop ทำ อาจจะเปลืองแรงอยู่ ก็เลยลองเอา Python Image Library (PIL) ที่เคยเล่นอยู่นิดๆ หน่อยๆ มาลองเขียนดู
ทีแรกก็โหลด module แล้วก็เปิดไฟล์ภาพขึ้นมาก่อน เขียนง่ายๆ คือ
import Image
src_img = Image.open("/tmp/hires.jpg")

วนลูปก็ทำได้ไม่ยาก
for x in xrange(0, 13500, 1350):
for y in xrange(0, 13500, 900):
# do something

วิธีตัดรูปออกมา ใช้ method crop() ซึ่งจะ return Image ออกมาให้ พารามิเตอร์ใส่เป็น tuple บอกตำแหน่ง 4 มุม
piece = src_img.crop((x, y, x+1350, y+900))
ผมต้องการเพิ่มขอบด้านขวาเข้าไป เพื่อเอาไว้แสดงตัวเลขลำดับรูป แต่คิดวิธีอื่นไม่ออก เลยใช้วิธีสร้าง Image ขึ้นมาใหม่ให้มีขนาด 1400 x 900 แล้วเอารูปที่ตัดได้มาแปะชิดซ้าย ก็จะได้ขอบด้านขวาตามต้องการ
newpiece = Image.new("RGB", (1400, 900), (255, 255, 255)) # mode, size, color
newpiece.paste(piece, (0, 0)) # paste at (0, 0)

มาถึงการใส่ตัวหนังสือลงไป อันนี้ต้องใช้อีก module คือ ImageDraw จะทำให้เราสามารถใส่ตัวหนังสือ หรือลากเส้นบนรูปได้
ที่จริงตรงนี้เขียนเป็น text อันเดียวก็ได้ แต่มันจะเลยขอบ ต้องเขียนตะแคง แต่ขี้เกียจอ่าน document เรื่อง rotation ก็เลยมักง่ายเขียนเอาแบบนี้
import ImageDraw
draw = ImageDraw.Draw(newpiece)

draw.text((1355,10), "%d" % x/1350, (0, 0, 0)) # put text at (1355, 10), color = black
draw.text((1355,50), "%d" % y/900, (0, 0, 0))

ปรากฏว่าตัวหนังสือที่ได้มันเล็กเกินไปอีก ถ้าจะปรับแต่งฟอนต์ต้องให้ module ImageFont
import ImageFont
ft = ImageFont.truetype("tahoma.ttf", 30) # Tahoma, 30 point

โค้ดส่วนเขียนตัวหนังสือต้องเพิ่มพารามิเตอร์ไปอีกตัว
draw.text((1355,50), "%d" % y/900, (0, 0, 0), font=ft)
สุดท้ายก็สั่งให้เซฟ ปล่อยให้ทำงานวนลูปจนเสร็จ
newpiece.save("img_%d_%d.jpg" % (x/1350, y/900), quality=85)

สุดท้ายก็เอารูปที่ได้ทั้งหมดไปอัดที่ร้าน ตัดขอบด้านข้างทิ้ง เอามาแปะรวมกัน ก็จะเรียบร้อย

ที่มา - Don't Think, just read.

Get latest news from Blognone

Comments

By: loptar on 14 August 2006 - 22:20 #8844
loptar's picture

กระบวนการทั้งหมด ใช้เวลาเท่าไหร่ครับ คุ้มกว่าการใช้ image editor โดยตรงมั้ย :-)

By: pittaya
WriterAndroidUbuntuIn Love
on 15 August 2006 - 01:01 #8846
pittaya's picture

loptar - ใช้เวลาไม่นานนะครับ ไม่เกินชั่วโมงนึง เทียบดูกับการใช้ The Gimp (image editor ตัวเดียวที่ผมมีและใช้งานได้ไม่ค่อยคล่อง) ก็ประหยัดเวลาไปได้เยอะ


pittaya.com

By: lew
FounderJusci's WriterMEconomicsAndroid
on 15 August 2006 - 01:33 #8847
lew's picture

loptor - ยิ่งถ้าต้องแบ่งเป็นพันรูปล่ะ ใช้ PIL ดีกว่าแน่ๆ ครับ อย่างมากก็เปิดเครื่องทิ้งไว้คืนนึง คงดีกว่ามานั่งทำเองทั้งคืน.... ------ LewCPE


lewcpe.com, @wasonliw

By: xinexo on 15 August 2006 - 21:33 #8859

น่าสนใจแฮะ python -------------------------------------------------------- เวบของเค้า...และเพินที่เค้ารัก www.mooling.com

By: wearetherock
BlackberryUbuntu
on 23 December 2006 - 23:04 #14738

เก่งครับ