Bitmap/Python

From Rosetta Code
Bitmap/Python is part of Basic bitmap storage. You may find other members of Basic bitmap storage at Category:Basic bitmap storage.

Translation of Ada (well, roughly)

Works with: python version 2.4

<lang Python>import sys # for stdout

class c_color(object): def __init__(self, p_r = 0, p_g = 0, p_b = 0): self.put(p_r, p_g, p_b)

def clone(self): return c_color(self.r, self.g, self.b)

def put(self, p_r, p_g, p_b): self.r = p_r self.g = p_g self.b = p_b

def get_r(self): return self.r

def get_g(self): return self.g

def get_b(self): return self.b

def __eq__(self, other): return self.r == other.r and self.g == other.g and self.b == other.b

def __ne__(self, other): return not (self == other)

black = c_color(0,0,0) white = c_color(255,255,255)

class c_bitmap_store(object):

   def __init__(self, p_width = 80, p_height = 40):
       self.instructions = 

self.width = p_width self.height = p_height self.pixels = [[white.clone() for x in range(self.width)] for y in range(self.height)]


   def fill(self, x, y, w, h, color):
       for I in range(w):
           for J in range(h):

self.put(x+I, y+J, color)

   def display(self):
       for J in range(self.height):
            for I in range(self.width):

if self.get(i,j) == white: sys.stdout.write(" ") else: sys.stdout.write("H")

            print
   def put(self, x,y, color):

assert type(color) is c_color self.pixels[y][x] = color

   def get(self, x,y):

result = self.pixels[y][x] assert type(result) is c_color return result</lang>

Alternative version

Works with: Python version 3.1

This makes use of named tuples and may well work with Python 2.6+ too. <lang python>from collections import namedtuple from copy import copy

Colour = namedtuple('Colour','r,g,b') Colour.copy = lambda self: copy(self)

black = Colour(0,0,0) white = Colour(255,255,255) # Colour ranges are not enforced.

class Bitmap():

   def __init__(self, width = 40, height = 40, background=white):
       assert width > 0 and height > 0 and type(background) == Colour
       self.width = width
       self.height = height
       self.background = background
       self.map = [[background.copy() for w in range(width)] for h in range(height)]
   def fillrect(self, x, y, width, height, colour=black):
       assert x >= 0 and y >= 0 and width > 0 and height > 0 and type(colour) == Colour
       for h in range(height):
           for w in range(width):
               self.map[y+h][x+w] = colour.copy()
   def chardisplay(self):
       txt = [.join(' ' if bit==self.background else '@'
                      for bit in row)
              for row in self.map]
       # Boxing
       txt = ['|'+row+'|' for row in txt]
       txt.insert(0, '+' + '-' * self.width + '+')
       txt.append('+' + '-' * self.width + '+')
       print('\n'.join(reversed(txt)))
   def set(self, x, y, colour):
       assert type(colour) == Colour
       self.map[y][x]=colour

   def get(self, x, y):

return self.map[y][x]


bitmap = Bitmap(20,10) bitmap.fillrect(4, 5, 6, 3) assert bitmap.get(5, 5) == black assert bitmap.get(0, 1) == white bitmap.set(0, 1, black) assert bitmap.get(0, 1) == black bitmap.chardisplay()

The origin, 0,0; is the lower left, with x increasing to the right, and Y increasing upwards.

The program above produces the following display :

+--------------------+ | | | | | @@@@@@ | | @@@@@@ | | @@@@@@ | | | | | | | |@ | | | +--------------------+

</lang>