Tổng quan
Đưa ra một hình ảnh ở định dạng PPM (P3) đơn giản làm đầu vào, cho mỗi pixel p
trong ảnh, thay thế từng màu đỏ, xanh lục và xanh lam của 4 pixel sau bằng giá trị trung bình nổi của các kênh tương ứng của cả 4 pixel:
p
chinh noPixel nằm ở
p
vị trí của hình ảnh khi lật hình ảnh theo chiều dọcPixel nằm ở
p
vị trí của hình ảnh khi lật hình ảnh theo chiều ngangPixel nằm ở
p
vị trí của hình ảnh khi hình ảnh được lật theo cả chiều dọc và chiều ngang
Xuất hình ảnh kết quả ở định dạng PPM (P3) đơn giản.
Để giải thích thêm, hãy xem xét hình ảnh 8x8 này, được phóng to lên 128x128:
Hãy p
là pixel đỏ. Để tính giá trị mới cho p
(và 3 pixel màu xanh), các giá trị của p
và 3 pixel màu xanh sẽ được tính trung bình cùng nhau:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Ví dụ
Thực hiện tham khảo
#!/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])
Chương trình này lấy một tên tệp làm đầu vào, được định dạng như đầu ra của pngtopnm <pngfile> -plain
và xuất ra một dòng dữ liệu PPM được phân tách bằng dấu cách.
Mô tả ngắn gọn về định dạng P3
Một tệp văn bản PPM được tạo từ pngtopnm <pngfile> -plain
sẽ trông như thế này:
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>
<...>
Đây là định dạng mà các tệp đầu vào và đầu ra ví dụ sử dụng. Tuy nhiên, PNM rất lỏng lẻo về định dạng của nó - bất kỳ khoảng trắng nào cũng có thể tách các giá trị. Bạn có thể thay thế tất cả các dòng mới trong tệp trên bằng một khoảng trống duy nhất và vẫn có một tệp hợp lệ. Ví dụ: tệp này và tệp này đều hợp lệ và đại diện cho cùng một hình ảnh. Các yêu cầu duy nhất khác là tệp phải kết thúc bằng một dòng mới và phải có width*height
bộ ba RGB theo sau 255
.
Quy tắc
- Đây là môn đánh gôn , vì vậy giải pháp hợp lệ ngắn nhất sẽ thắng.
- Bạn có thể nhập và xuất dữ liệu PPM được định dạng theo bất kỳ cách thuận tiện và nhất quán nào, miễn là nó hợp lệ theo định dạng PPM được mô tả ở trên. Ngoại lệ duy nhất là bạn phải sử dụng định dạng thuần (P3) chứ không phải định dạng nhị phân (P6).
- Bạn phải cung cấp xác minh rằng giải pháp của bạn đưa ra hình ảnh chính xác cho hình ảnh thử nghiệm ở trên.
- Tất cả các hình ảnh sẽ có độ sâu 8 bit.
Đọc thêm: trang wikipedia định dạng Netpbm