Ultima attività 1748938254

aneuhaeuser ha revisionato questo gist 1748938254. Vai alla revisione

Nessuna modifica

aneuhaeuser ha revisionato questo gist 1748890694. Vai alla revisione

Nessuna modifica

aneuhaeuser ha revisionato questo gist 1748890559. Vai alla revisione

1 file changed, 62 insertions

bmp.py(file creato)

@@ -0,0 +1,62 @@
1 + class BMPImage:
2 + def __init__(self, data):
3 + self.data = data
4 + self._get_bmp_header()
5 + self._get_bmp_info_header()
6 + self._get_bmp_color_table()
7 +
8 + offset = self.header["offset"]
9 +
10 + self.BITMAP = memoryview(data[offset:])
11 + self.HEIGHT = self.info_header["height"]
12 + self.WIDTH = self.info_header["width"]
13 + self.COLORS = self.info_header["colors_used"]
14 + self.BPP = self.info_header["bit_count"] # Bits per pixel
15 + self.PALLETTE = self.color_table
16 +
17 + def _get_bmp_header(self):
18 + d = self.data
19 + self.header = {
20 + "signature": d[0:2].decode("ascii"),
21 + "file_size": int.from_bytes(data[2:6], "little"),
22 + "offset": int.from_bytes(data[10:14], "little"),
23 + "header_size": int.from_bytes(data[14:18], "little"),
24 + }
25 +
26 + def _get_bmp_info_header(self):
27 + offset = 14 # BMP header size
28 + data = self.data[offset:]
29 +
30 + self.info_header = {
31 + "size": int.from_bytes(data[0:4], "little"),
32 + "width": int.from_bytes(data[4:8], "little"),
33 + "height": int.from_bytes(data[8:12], "little"),
34 + "planes": int.from_bytes(data[12:14], "little"),
35 + "bit_count": int.from_bytes(data[14:16], "little"),
36 + "compression": int.from_bytes(data[16:20], "little"),
37 + "image_size": int.from_bytes(data[20:24], "little"),
38 + "x_pixels_per_meter": int.from_bytes(data[24:28], "little"),
39 + "y_pixels_per_meter": int.from_bytes(data[28:32], "little"),
40 + "colors_used": int.from_bytes(data[32:36], "little"),
41 + "important_colors": int.from_bytes(data[36:40], "little"),
42 + }
43 +
44 +
45 + def _get_bmp_color_table(self):
46 + bpp = self.info_header["bit_count"]
47 + color_amount = self.info_header["colors_used"]
48 +
49 + if bpp > 8:
50 + self.color_table = []
51 + return
52 +
53 + if color_amount == 0:
54 + color_amount = 2 ** bpp
55 +
56 + offset = 14 + 40 # File header + Info header
57 + data = self.data[offset:offset + color_amount * 4]
58 +
59 + self.color_table = [
60 + int.from_bytes(data[i:i+4], "little")
61 + for i in range(0, len(data), 4)
62 + ]
Più nuovi Più vecchi