# Translate list of bytes to number def bytes_to_number(L): x = 0 for b in reversed(L): x = x * 256 + b return x # Read Image def read_image(file_name): with open(file_name, 'rb') as f: code = list(f.read()) # list of file bytes offset = bytes_to_number(code[10:14]) # where colors data begins w = bytes_to_number(code[18:22]) # decode width h = bytes_to_number(code[22:26]) # decode height line_size = (3 * w + 3) // 4 * 4 # line size in bytes, must be aligned by 4 bytes return (code, w, h, line_size, offset) # Put one new color in image bytes # color is in (b, g, r) format def put_pixel(image, x, y, color): offset = image[4] + image[3] * (image[2] - 1 - y) + x * 3 image[0][offset:offset + 3] = color # Get color of a pixel with (x, y) coordinates # color is in (b, g, r) format def get_pixel(image, x, y): offset = image[4] + image[3] * (image[2] - 1 - y) + x * 3 return image[0][offset:offset + 3] im = read_image('sample.bmp') w = im[1] h = im[2] # Image processing for y in range(h): for x in range(w): c = get_pixel(im, x, y) # ... doing something with color 'c' put_pixel(im, x, y, new_color) # Save result with open('result.bmp', 'wb') as f: f.write(bytes(im[0]))