#!/usr/bin/env python # SPDX-License-Identifier: GPL-2.0 */ # -*- coding: utf-8 -*- from struct import unpack, pack import sys import getopt class BMPFile: def __init__(self, file_path, force_revers=0, force_swap=0): self.file = open(file_path, "rb+") # bmp head 14bit self.bfType = unpack(" 40: self.read_other(self.biSize-40) if self.biBitCount == 16 and self.biCompression == 3: for i in range(4): self.bf_map.append( [unpack(" 0: self.reverse_bmp_data() print("reverse data at first time") if self.force_revers: self.reverse_bmp_data() print("reverse data by force") if self.force_swap: self.rb_swap = 1 print("swap rb by force'") if self.bfReserved1 == 8399: self.file.close() return self.write_24bit(self.rb_swap) self.file.close() def read_other(self, n): for i in range(n): self.file.read(1) def reverse_bmp_data(self): self.bmp_data.reverse() @staticmethod def get_16bit_bgr_bf(pixel): red = (pixel[1] & 0xf8) << 0 green = ((pixel[1] & 0x07) << 5) | ((pixel[0] & 0xe0) >> 3) blue = ((pixel[0] & 0x1f) << 3) new_pixel = [blue, green, red] return new_pixel def bmp32bit_to_24bit(self): for height in range(abs(self.biHeight)): bmp_data_row = [] # bmp file 4 align count = 0 for width in range(self.biWidth): bmp_data_row.append( [unpack(" 0: data2 = unpack(" 2: data_count = data2 data_temp = unpack("> 2) blue = ((pixel[0] & 0x1f) << 3) new_pixel = [blue, green, red] return new_pixel def bmp16bit_to_24bit(self): self.get_16bit_data() temp_data = self.bmp_data self.bmp_data = [] for height in range(abs(self.biHeight)): bmp_data_row = [] for width in range(self.biWidth): bmp_data_row.append( self.get_16bit_bgr(temp_data[height][width]) ) self.bmp_data.append(bmp_data_row) def get_head(self): self.file.seek(0, 0) for i in range(54): self.head.append(unpack("