Skip to content

Instantly share code, notes, and snippets.

@voidw0rd
Created June 28, 2012 12:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save voidw0rd/3011092 to your computer and use it in GitHub Desktop.
Save voidw0rd/3011092 to your computer and use it in GitHub Desktop.
Python bitmap
import struct, random, sys
from PIL import Image
class Bitmap(object):
def __gen_radom_pixel__(self):
return 111
return random.randint(0, 255)
def __init__(self, header=None, filename=None):
self.default_header = { 'importantcolors':0, 'filesize':0,'undef1':0,
'undef2':0, 'offset':54, 'headerlength':40, 'mn1':66,
'width':20, 'height':20, 'colorplanes':8,
'colordepth':24, 'compression':0, 'imagesize':0,
'res_hor':0, 'res_vert':0,'palette':0, 'mn2':77 }
self.header = header or self.default_header
self.filename = filename
def __make_pixels__(self):
im = Image.open(self.filename)
pixels = list(im.getdata())
width, height = im.size
self.header['width'] = width
self.header['height'] = height
pixels = [pixels[i * width:(i + 1) * width] for i in xrange(height)]
p = ''
for row in pixels:
for column in row:
r = column[0]
g = column[1]
b = column[2]
p += self.binary_color(r, g, b)
p += self.padding(self.header['width'], self.header['colordepth'])
return p
def __make_header__(self):
header = self.header
header_str = ""
header_str += struct.pack('<B', header['mn1'])
header_str += struct.pack('<B', header['mn2'])
header_str += struct.pack('<L', header['filesize'])
header_str += struct.pack('<H', header['undef1'])
header_str += struct.pack('<H', header['undef2'])
header_str += struct.pack('<L', header['offset'])
header_str += struct.pack('<L', header['headerlength'])
header_str += struct.pack('<L', header['width'])
header_str += struct.pack('<L', header['height'])
header_str += struct.pack('<H', header['colorplanes'])
header_str += struct.pack('<H', header['colordepth'])
header_str += struct.pack('<L', header['compression'])
header_str += struct.pack('<L', header['imagesize'])
header_str += struct.pack('<L', header['res_hor'])
header_str += struct.pack('<L', header['res_vert'])
header_str += struct.pack('<L', header['palette'])
header_str += struct.pack('<L', header['importantcolors'])
return header_str
def binary_color(self, red, green, blue):
assert red >= 0 and red <= 255, "Red value should be 0-255, and its %s" % red
assert green >= 0 and green <= 255, "Green value should be 0-255, and its %s" % green
assert blue >= 0 and blue <= 255, "Blue value should be 0-255, and its %s" % blue
return struct.pack('<BBB', blue, green, red)
def set_w_h(self, width, height):
self.header['width'] = width
self.header['height'] = height
def padding(self, width, depth):
byte_len = width * depth / 8
pad = (4 - byte_len) % 4
pad_byte = ''
for index in range(pad):
val = struct.pack("<B", 0)
pad_byte += val
return pad_byte
def write_to_file(self, filename, header, pixels):
try:
out = open(filename, 'wb')
out.write(header + pixels)
out.close()
except:
pass
def make_bmp(self, filename):
pixels = self.__make_pixels__()
header_binary = self.__make_header__()
self.write_to_file(filename, header_binary, pixels)
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.exit(1)
bmp = Bitmap(None, sys.argv[1])
bmp.make_bmp("/tmp/test.bmp")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment