ภาพรวม
กำหนดภาพในรูปแบบ PPM ธรรมดา (P3) เป็นอินพุตสำหรับแต่ละพิกเซลp
ในภาพให้แทนที่แต่ละสีแดงเขียวและน้ำเงิน 4 พิกเซลต่อไปนี้ด้วยค่าเฉลี่ยที่เป็นพื้นของช่องทางที่เกี่ยวข้องของพิกเซลทั้ง 4:
p
ตัวเองพิกเซลตั้งอยู่ที่
p
ตำแหน่งของเมื่อภาพถูกพลิกในแนวตั้งพิกเซลตั้งอยู่ที่
p
ตำแหน่งของเมื่อภาพถูกพลิกในแนวนอนพิกเซลตั้งอยู่ที่
p
ตำแหน่งเมื่อภาพถูกพลิกทั้งในแนวตั้งและแนวนอน
แสดงผลภาพที่ได้ในรูปแบบ PPM ธรรมดา (P3)
สำหรับคำอธิบายเพิ่มเติมให้พิจารณาภาพ 8x8 นี้ขยายเป็น 128x128:
อนุญาตp
เป็นพิกเซลสีแดง ในการคำนวณค่าใหม่สำหรับp
(และพิกเซล 3 สีฟ้า) ค่าของp
และพิกเซลสีน้ำเงิน 3 ค่าจะถูกรวมเข้าด้วยกัน:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
ตัวอย่าง
การดำเนินการอ้างอิง
#!/usr/bin/python
import sys
from itertools import *
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return list(izip_longest(*args, fillvalue=fillvalue))
def flatten(lst):
return sum(([x] if not isinstance(x, list) else flatten(x) for x in lst), [])
def pnm_to_bin(p):
w,h = map(int,p[1].split(' '))
data = map(int, ' '.join(p[3:]).replace('\n', ' ').split())
bin = []
lines = grouper(data, w*3)
for line in lines:
data = []
for rgb in grouper(line, 3):
data.append(list(rgb))
bin.append(data)
return bin
def bin_to_pnm(b):
pnm = 'P3 {} {} 255 '.format(len(b[0]), len(b))
b = flatten(b)
pnm += ' '.join(map(str, b))
return pnm
def imageblender(img):
h = len(img)
w = len(img[0])
for y in range(w):
for x in range(h):
for i in range(3):
val = (img[x][y][i] + img[x][~y][i] + img[~x][y][i] + img[~x][~y][i])//4
img[x][y][i],img[x][~y][i],img[~x][y][i],img[~x][~y][i] = (val,)*4
return img
def main(fname):
bin = pnm_to_bin(open(fname).read().split('\n'))
bin = imageblender(bin)
return bin_to_pnm(bin)
if __name__ == '__main__':
print main(sys.argv[1])
โปรแกรมนี้ใช้ชื่อไฟล์เดียวเป็นอินพุตในรูปแบบเช่นผลลัพธ์ของ pngtopnm <pngfile> -plain
และส่งออกข้อมูล PPM บรรทัดเดียวโดยคั่นด้วยช่องว่าง
คำอธิบายสั้น ๆ ของรูปแบบ P3
ไฟล์ข้อความธรรมดา PPM ที่สร้างจากpngtopnm <pngfile> -plain
จะมีลักษณะเช่นนี้:
P3
<width in pixels> <height in pixels>
<maximum value as defined by the bit depth, always 255 for our purposes>
<leftmost 24 pixels of row 1, in RGB triples, space-separated; like (0 0 0 1 1 1 ...)>
<next 24 pixels of row 1>
<...>
<rightmost (up to) 24 pixels of row 1>
<leftmost 24 pixels of row 2>
<next 24 pixels of row 2>
<...>
<rightmost (up to) 24 pixels of row 2>
<...>
นี่เป็นรูปแบบที่ไฟล์อินพุตและเอาต์พุตตัวอย่างใช้ อย่างไรก็ตาม PNM นั้นหลวมมากเกี่ยวกับการจัดรูปแบบ - ช่องว่างใด ๆอาจแยกค่าได้ คุณสามารถแทนที่บรรทัดใหม่ทั้งหมดในไฟล์ด้านบนด้วยช่องว่างเดียวและยังมีไฟล์ที่ถูกต้อง ตัวอย่างเช่นไฟล์นี้และไฟล์นี้มีทั้งที่ถูกต้องและเป็นตัวแทนของภาพเดียวกัน ความต้องการอื่น ๆ ที่มีเพียงว่าไฟล์จะต้องจบลงด้วยการขึ้นบรรทัดใหม่และต้องมีwidth*height
แฝดสาม RGB 255
ดังต่อไปนี้
กฎระเบียบ
- นี่คือ รหัสกอล์ฟดังนั้นวิธีแก้ปัญหาที่สั้นที่สุดจะชนะ
- คุณสามารถป้อนข้อมูลและส่งออกข้อมูล PPM ที่จัดรูปแบบในลักษณะที่สะดวกและสอดคล้องกันตราบใดที่มันถูกต้องตามรูปแบบ PPM ที่อธิบายไว้ข้างต้น ข้อยกเว้นเพียงอย่างเดียวคือคุณต้องใช้รูปแบบธรรมดา (P3) และไม่ใช่รูปแบบไบนารี (P6)
- คุณต้องให้การตรวจสอบว่าทางออกของคุณส่งภาพที่ถูกต้องสำหรับภาพทดสอบข้างต้น
- ภาพทั้งหมดจะมีความลึกบิต 8 บิต
อ่านเพิ่มเติม: หน้ารูปแบบ Netpbm วิกิพีเดีย