Extra: van tekst naar beeld¶
Deze uitwerking gebruikt het meegeleverde ../problems/assets/patroon.txt als tekstdata. png.py hoort bij de bestaande beeldroute uit fraaie_plaatjes.zip; pak die zip uit voordat je de laatste functie uitvoert.
def read_raster(filename):
"""Lees een niet-leeg rechthoekig raster met . en #."""
with open(filename) as bestand:
raster = []
for regel in bestand:
raster = raster + [regel[:-1]]
assert len(raster) > 0
breedte = len(raster[0])
assert breedte > 0
for regel in raster:
assert len(regel) == breedte
assert len(regel) > 0
for teken in regel:
assert teken == "." or teken == "#"
return raster
def raster_to_pixels(raster):
"""Zet . en # om in witte en zwarte RGB-lijsten."""
assert len(raster) > 0
breedte = len(raster[0])
assert breedte > 0
pixels = []
for regel in raster:
assert len(regel) == breedte
pixelregel = []
for teken in regel:
if teken == ".":
pixelregel = pixelregel + [[255, 255, 255]]
else:
assert teken == "#"
pixelregel = pixelregel + [[0, 0, 0]]
pixels = pixels + [pixelregel]
return pixels
def scale_pixels(pixels):
"""Maak van iedere pixel een blok van 8 bij 8 pixels."""
assert len(pixels) > 0
breedte = len(pixels[0])
assert breedte > 0
for regel in pixels:
assert len(regel) == breedte
geschaald = []
for regel in pixels:
brede_regel = []
for pixel in regel:
for kolom in range(8):
brede_regel = brede_regel + [pixel[:]]
for rij in range(8):
kopie_regel = []
for pixel in brede_regel:
kopie_regel = kopie_regel + [pixel[:]]
geschaald = geschaald + [kopie_regel]
return geschaald
try:
from png import save_rgb
png_beschikbaar = True
except ImportError:
png_beschikbaar = False
def write_pattern_image(pixels):
"""Schrijf de geschaalde pixels als patroon.png."""
assert len(pixels) == 128
assert len(pixels[0]) == 128
assert png_beschikbaar
save_rgb(pixels, "patroon.png")
raster = read_raster("../problems/assets/patroon.txt")
assert len(raster) == 16
assert len(raster[0]) == 16
pixels = raster_to_pixels(raster)
assert len(pixels) == 16
assert len(pixels[0]) == 16
assert pixels[0][0] == [255, 255, 255]
assert pixels[2][4] == [0, 0, 0]
assert pixels[6][8] == [0, 0, 0]
klein = raster_to_pixels([".#"])
assert klein == [[[255, 255, 255], [0, 0, 0]]]
geschaald = scale_pixels(pixels)
assert len(geschaald) == 128
assert len(geschaald[0]) == 128
assert geschaald[16][32] == [0, 0, 0]
assert geschaald[0][0] == [255, 255, 255]
zwarte_bron = 0
for regel in raster:
for teken in regel:
if teken == "#":
zwarte_bron = zwarte_bron + 1
zwarte_geschaald = 0
for regel in geschaald:
for pixel in regel:
if pixel == [0, 0, 0]:
zwarte_geschaald = zwarte_geschaald + 1
assert zwarte_geschaald == zwarte_bron * 64
for bron_rij in range(16):
for bron_kolom in range(16):
kleur = pixels[bron_rij][bron_kolom]
for rij in range(bron_rij * 8, (bron_rij + 1) * 8):
for kolom in range(bron_kolom * 8, (bron_kolom + 1) * 8):
assert geschaald[rij][kolom] == kleur
assert write_pattern_image.__name__ == "write_pattern_image"
# Na het uitpakken van fraaie_plaatjes.zip: write_pattern_image(geschaald)