Naposledy aktivní 1748938254

aneuhaeuser revidoval tento gist 1748938254. Přejít na revizi

Žádné změny

aneuhaeuser revidoval tento gist 1748890694. Přejít na revizi

Žádné změny

aneuhaeuser revidoval tento gist 1748890559. Přejít na revizi

1 file changed, 62 insertions

bmp.py(vytvořil soubor)

@@ -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 + ]
Novější Starší