अवलोकन
इनपुट के रूप में सादे पीपीएम (पी 3) प्रारूप में एक छवि को देखते हुए, छवि में प्रत्येक पिक्सेल p
के लिए, निम्नलिखित 4 पिक्सेल के लाल, हरे और नीले रंग में से प्रत्येक को 4 पिक्सेल के संबंधित चैनलों के फ्लोर्ड औसत मान से बदलें:
p
अपने आपp
जब छवि लंबवत रूप से फ़्लिप की जाती है, तो पिक्सेल स्थित हैp
जब छवि क्षैतिज रूप से फ़्लिप की जाती है, तो पिक्सेल स्थित हैp
छवि के लंबवत और क्षैतिज रूप से फ़्लिप किए जाने पर पिक्सेल स्थित है
परिणामी छवि को सादे PPM (P3) प्रारूप में आउटपुट करें।
आगे की व्याख्या के लिए, इस 8x8 छवि पर विचार करें, जिसे 128x128 तक बढ़ाया गया है:
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
, और रिक्त स्थान से अलग पीपीएम डेटा की एक पंक्ति को आउटपुट करता है।
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>
<...>
यह वह प्रारूप है जिसका उदाहरण इनपुट और आउटपुट फाइल उपयोग करते हैं। हालांकि, पीएनएम अपने स्वरूपण के बारे में बहुत ढीला है - कोई भी व्हाट्सएप अलग-अलग मान हो सकता है। आप उपरोक्त फ़ाइल की सभी नई सूचियों को एक ही स्थान से बदल सकते हैं, और फिर भी एक मान्य फ़ाइल रख सकते हैं। उदाहरण के लिए, यह फ़ाइल और यह फ़ाइल दोनों मान्य हैं, और समान छवि का प्रतिनिधित्व करते हैं। केवल अन्य आवश्यकताएं हैं कि फ़ाइल एक अनुगामी न्यूलाइन के साथ समाप्त होनी चाहिए, और width*height
निम्नलिखित के बाद RGB ट्रिपल होनी चाहिए 255
।
नियम
- यह कोड-गोल्फ है , इसलिए सबसे छोटा वैध समाधान जीतता है।
- आप इनपुट और आउटपुट पीपीएम डेटा को किसी भी सुविधाजनक और सुसंगत तरीके से स्वरूपित कर सकते हैं, इसलिए जब तक यह ऊपर वर्णित पीपीएम प्रारूप के अनुसार मान्य है। एकमात्र अपवाद यह है कि आपको सादे (P3) प्रारूप का उपयोग करना चाहिए, न कि बाइनरी (P6) प्रारूप का।
- आपको यह सत्यापित करना होगा कि आपका समाधान उपरोक्त परीक्षण छवियों के लिए सही छवियों को आउटपुट करता है।
- सभी छवियों में 8 बिट की गहराई होगी।
अतिरिक्त पढ़ने: Netpbm प्रारूप विकिपीडिया पृष्ठ