Extra: van tekst naar beeld

Deze pagina bevat uitvoerbare code.

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)