Panoramica
Data un'immagine in formato PPM (P3) semplice come input, per ciascun pixel p
nell'immagine, sostituisci ciascuno dei seguenti 4 pixel in rosso, verde e blu con il valore medio pavimentato dei rispettivi canali di tutti e 4 i pixel:
p
siIl pixel situato nella
p
posizione dell 'immagine quando l'immagine viene capovolta verticalmenteIl pixel situato nella
p
posizione dell 'immagine quando l'immagine viene capovolta orizzontalmenteIl pixel situato nella
p
posizione dell 'immagine quando l'immagine viene capovolta sia in verticale che in orizzontale
Stampa l'immagine risultante in formato PPM (P3) semplice.
Per ulteriori spiegazioni, considera questa immagine 8x8, ingrandita a 128x128:
Lascia che p
sia il pixel rosso. Per calcolare il nuovo valore per p
(e i 3 pixel blu), i valori di p
e dei 3 pixel blu saranno calcolati insieme in media:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Esempi
Implementazione di riferimento
#!/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])
Questo programma utilizza un singolo nome file come input, formattato come l'output di pngtopnm <pngfile> -plain
e genera una singola riga di dati PPM separati da spazi.
Una breve descrizione del formato P3
Un file in testo semplice PPM generato da pngtopnm <pngfile> -plain
sarà simile al seguente:
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>
<...>
Questo è il formato utilizzato dai file di input e output di esempio. Tuttavia, PNM è molto libero riguardo alla sua formattazione: qualsiasi spazio bianco può separare i valori. È possibile sostituire tutte le nuove righe nel file sopra con un singolo spazio ciascuna e avere comunque un file valido. Ad esempio, questo file e questo file sono entrambi validi e rappresentano la stessa immagine. Gli unici altri requisiti sono che il file deve terminare con una nuova riga finale e che devono essere presenti width*height
terzine RGB 255
.
Regole
- Questo è code-golf , quindi vince la soluzione valida più breve.
- È possibile immettere e produrre dati PPM formattati in qualsiasi modo conveniente e coerente, purché sia valido secondo il formato PPM sopra descritto. L'unica eccezione è che è necessario utilizzare il formato normale (P3) e non il formato binario (P6).
- È necessario fornire la verifica che la soluzione fornisca le immagini corrette per le immagini di prova sopra riportate.
- Tutte le immagini avranno una profondità di 8 bit.
Letture extra: pagina Wikipedia in formato Netpbm