Created
June 28, 2012 12:33
-
-
Save voidw0rd/3011092 to your computer and use it in GitHub Desktop.
Python bitmap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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