개요
일반 PPM (P3) 형식의 이미지가 입력 p
으로 제공되면 이미지의 각 픽셀 에 대해 다음 4 픽셀의 빨강, 녹색 및 파랑을 각각 4 픽셀의 각 채널의 평균 값으로 바꿉니다.
p
그 자체p
이미지를 세로로 뒤집을 때의 위치 에 위치한 픽셀p
이미지를 가로로 뒤집을 때의 위치 에 위치한 픽셀p
이미지가 수직 및 수평으로 뒤집힐 때의 위치 에 위치한 픽셀
결과 이미지를 일반 PPM (P3) 형식으로 출력합니다.
자세한 설명은 128x128로 확대 된이 8x8 이미지를 고려하십시오.
하자 p
적색 픽셀 수. p
(및 3 개의 파란색 픽셀)에 대한 새 값을 계산하려면 및 3 개의 파란색 픽셀 값이 p
함께 평균화됩니다.
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
입니다.
규칙
- 이것은 code-golf 이므로 가장 짧은 유효한 솔루션이 승리합니다.
- 위에서 설명한 PPM 형식에 따라 유효한 한 편리하고 일관된 방식으로 형식화 된 PPM 데이터를 입력 및 출력 할 수 있습니다. 유일한 예외는 이진 (P6) 형식이 아닌 일반 (P3) 형식을 사용해야한다는 것입니다.
- 솔루션이 위의 테스트 이미지에 올바른 이미지를 출력하는지 확인해야합니다.
- 모든 이미지의 비트 심도는 8 비트입니다.
추가 자료 : Netpbm 형식 위키 백과 페이지