Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
15 changes: 9 additions & 6 deletions bitmap.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,22 @@
class Bitmap(object):

"""Create a bitmap image file (.bmp).

Usage is simple:
>>> from bitmap import Bitmap
>>> bmp = Bitmap(10, 10, fill=(0, 100, 255)) # (r, g, b) background
>>> bmp.pencil(1, 1, (128, 128, 128))
>>> bmp.save('test.bmp')
"""

def __init__(self, width, height, fill=(0, 0, 0)):
"""Intialize the bitmap file."""
self._width = width
self._height = height

self._pixels = [
[fill for y in range(self._height)]
for x in range(self._width)
[fill for _ in range(self._height)]
for _ in range(self._width)
]

self._row_pad = (self._width*3) % 4
Expand All @@ -53,7 +53,8 @@ def save(self, path):

def _write_header(self, f):
"""Write the bitmap file header."""
file_size = 0x36 + ((self._width + self._row_pad)*self._height*3)
file_size = 0x36 + ((abs(self._width) +
self._row_pad)*abs(self._height)*3)

map(
f.write,
Expand All @@ -65,7 +66,9 @@ def _write_header(self, f):
bytearray([0x36, 0x00, 0x00, 0x00]), # Data offset
# DIB header, BITMAPINFOHEADER
bytearray([0x28, 0x00, 0x00, 0x00]), # DIB header size
# TODO: Change according to header version
struct.pack('<I', self._width), # Image width
# TODO: Change according to header version
struct.pack('<I', self._height), # Image height
bytearray([0x01, 0x00]), # Color planes
bytearray([0x18, 0x00]), # Bits per pixel
Expand All @@ -80,7 +83,7 @@ def _write_header(self, f):

def _write_pixels(self, f):
"""Write the array of pixels to the file."""
for y in reversed(range(self._height)):
for y in reversed(range(abs(self._height))):
row = [self._pixels[x][y] for x in range(self._width)]
row = [reversed(color) for color in row]
row = list(itertools.chain.from_iterable(row))
Expand Down