Ikhtisar
Diberikan gambar dalam format PPM (P3) polos sebagai input, untuk setiap piksel p
dalam gambar, ganti masing-masing merah, hijau, dan biru 4 piksel berikut dengan nilai rata-rata lantai dari saluran masing-masing dari 4 piksel:
p
diriPixel terletak di
p
lokasi ketika gambar dibalik secara vertikalPixel terletak di
p
lokasi ketika gambar dibalik secara horizontalPixel terletak di
p
lokasi ketika gambar dibalik secara vertikal dan horizontal
Keluarkan gambar yang dihasilkan dalam format PPM (P3) polos.
Untuk penjelasan lebih lanjut, pertimbangkan gambar 8x8 ini, diperbesar menjadi 128x128:
Membiarkan p
menjadi piksel merah. Untuk menghitung nilai baru untuk p
(dan 3 piksel biru), nilai p
dan 3 piksel biru akan dirata-ratakan bersama-sama:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Contohnya
Implementasi Referensi
#!/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])
Program ini mengambil nama file tunggal sebagai input, diformat seperti output pngtopnm <pngfile> -plain
, dan output satu baris data PPM yang dipisahkan oleh spasi.
Penjelasan Singkat tentang Format P3
File plaintext PPM yang dihasilkan pngtopnm <pngfile> -plain
akan terlihat seperti ini:
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>
<...>
Ini adalah format yang digunakan oleh file input dan output contoh. Namun, PNM sangat longgar tentang pemformatannya - spasi apa pun dapat memisahkan nilai. Anda dapat mengganti semua baris baru dalam file di atas dengan masing-masing satu ruang, dan masih memiliki file yang valid. Misalnya, file ini dan file ini sama-sama valid, dan mewakili gambar yang sama. Satu-satunya persyaratan lain adalah bahwa file harus diakhiri dengan baris baru, dan harus ada width*height
triplet RGB yang mengikuti 255
.
Aturan
- Ini adalah kode-golf , sehingga solusi terpendek yang valid menang.
- Anda dapat memasukkan dan mengeluarkan data PPM yang diformat dengan cara apa pun yang nyaman dan konsisten, asalkan valid sesuai dengan format PPM yang dijelaskan di atas. Satu-satunya pengecualian adalah Anda harus menggunakan format biasa (P3), dan bukan format biner (P6).
- Anda harus memberikan verifikasi bahwa solusi Anda menghasilkan gambar yang benar untuk gambar uji di atas.
- Semua gambar akan memiliki kedalaman 8 bit.
Bacaan ekstra: halaman wikipedia format Netpbm