def show1IFDTag(self, index: int): index -= 1 tag = self.s10_exif_1IFD_3tags[index] # bayt_length = tag.t2_type_2obj.t3_length * tag.t3_count_2int print() print("\t" + "#" * 63) print("\tTag No : " + str(index + 1)) print("\tTag (Hex) : '" + tag.t1_tag_1bytes.hex(sep=' ') + "'") print("\tTag Name : " + tag.t1_tag_2str) print("") print("\tData Type (Hex) : " + tag.t2_type_1bytes.hex(sep=' ')) print("\tData Type (str) : " + tag.t2_type_2obj.t2_name) print("\tData Length : " + str(bayt_length) + " bayt") if tag.t4_value_offset_3offset_bool: start_offset = clength(tag.t4_value_offset_1bytes) + 10 print("") print("\t(Data)") s4hex(dataBytes=self.s11_data[start_offset:start_offset + bayt_length], columnSize=20) else: print("") print("\t(Data)") s4hex(dataBytes=tag.t4_value_offset_1bytes, columnSize=20) print("\t" + "#" * 63)
def showAll(self): txt1_format = "\t{:<21} : '{}' {}" txt1_tmp1 = "(-" + Kind.findType( bytesData=self.s0_app_marker).shortname + "-)" txt1 = txt1_format.format('App Marker', self.s0_app_marker.hex(sep=' '), txt1_tmp1) txt2_tmp1 = '(' + str(clength(data=self.s1_app_length)) + ' bayt)' txt2 = txt1_format.format('App Length', self.s1_app_length.hex(sep=' '), txt2_tmp1) txt3 = txt1_format.format('JFXX Marker', self.s2_jfxx_marker.hex(sep=' '), "'JFXX\\x00'") if self.s3_jfxx_thumbnail_format == b'10': txt4_tmp1 = '(-JPEG format-)' elif self.s3_jfxx_thumbnail_format == b'11': txt4_tmp1 = '(-1 byte per pixel palettized format-)' elif self.s3_jfxx_thumbnail_format == b'13': txt4_tmp1 = '(-3 byte per pixel RGB format-)' else: txt4_tmp1 = '(?)' txt4 = txt1_format.format('JFXX Thumbnail Format', self.s3_jfxx_thumbnail_format.hex(), txt4_tmp1) print(txt1) print(txt2) print(txt3) print(txt4) s2hex(dataBytes=self.s4_jfxx_thumbnail_data, dataName="'JFXX Thumbnail Data'", columnSize=20)
def showGpsIFDTags(self): count = 1 for tag in self.s9_exif_GpsIFD_3tags: bayt_length = tag.t2_type_2obj.t3_length * tag.t3_count_2int print() print("\t" + "#" * 63) print("\tTag No : " + str(count)) print("\tTag (Hex) : '" + tag.t1_tag_1bytes.hex(sep=' ') + "'") print("\tTag Name : " + tag.t1_tag_2str) print("") print("\tData Type (Hex) : " + tag.t2_type_1bytes.hex(sep=' ')) print("\tData Type (str) : " + tag.t2_type_2obj.t2_name) print("\tData Length : " + str(bayt_length) + " bayt") if tag.t4_value_offset_3offset_bool: start_offset = clength(tag.t4_value_offset_1bytes) + 10 print("") print("\t(Data)") s4hex(dataBytes=self.s11_data[start_offset:start_offset + bayt_length], columnSize=20) else: print("") print("\t(Data)") s4hex(dataBytes=tag.t4_value_offset_1bytes, columnSize=20) print("\t" + "#" * 63) count += 1
def find(self): data_length = len(self.s4_all_data) ii_start = 18 while True: if data_length >= (ii_start + 12): if self.s4_all_data[ii_start:ii_start + 4] == b'8BIM': item = photoshoptags() item.t0_index = ii_start item.t1_identifier_mark = self.s4_all_data[ ii_start:ii_start + 4] item.t2_tag = self.s4_all_data[ii_start + 4:ii_start + 6] item.t3_padding = self.s4_all_data[ii_start + 6:ii_start + 8] item.t4_count = self.s4_all_data[ii_start + 8:ii_start + 12] item.t4_count_int = clength(data=item.t4_count) ii_start += 12 item.t5_data = self.s4_all_data[ii_start:( ii_start + item.t4_count_int)] self.s3_photoshop_tags.append(item) ii_start += item.t4_count_int else: if self.s4_all_data[ii_start:ii_start + 1] == b'\x00': ii_start += 1 else: break else: break
def __init__(self, bytesData: bytes): self.s0_app_marker = bytesData[0:2] self.s1_app_length = bytesData[2:4] self.s1_app_length_int = clength(data=self.s1_app_length) self.s2_adobe_marker = bytesData[4:10] self.s2_adobe_marker_str = 'Adobe\\00' self.s3_all_data = bytesData
def __init__(self, bytesData: bytes): self.s0_app_marker = bytesData[0:2] self.s1_app_length = bytesData[2:4] self.s1_app_length_int = clength(data=self.s1_app_length) self.s2_photoshop_marker = bytesData[4:18] self.s2_photoshop_marker_str = self.s2_photoshop_marker.decode( encoding='utf-8', errors='replace') + '\\00' self.s3_photoshop_tags = [] self.s4_all_data = bytesData self.find()
def all(self) -> str: txt1_format = "\t{:<20} : '{}' {}" txt1_tmp1 = "(-" + Kind.findType( bytesData=self.s0_app_marker).shortname + "-)\n" txt1 = txt1_format.format('App Marker', self.s0_app_marker.hex(sep=' '), txt1_tmp1) txt2_tmp1 = '(' + str(clength(data=self.s1_app_length)) + ' bayt)\n' txt2 = txt1_format.format('App Length', self.s1_app_length.hex(sep=' '), txt2_tmp1) txt3 = txt1_format.format('JFIF Marker', self.s2_jfif_marker.hex(sep=' '), "'JFIF\\x00'\n") txt4_tmp1 = self.s3_jfif_version_1_major.hex( ) + ' ' + self.s3_jfif_version_2_minor.hex() txt4_tmp2 = '(' + str(ord(self.s3_jfif_version_1_major)) + '.' + str( ord(self.s3_jfif_version_2_minor)) + ')\n' txt4 = txt1_format.format('JFIF Version', txt4_tmp1, txt4_tmp2) if self.s4_jfif_density_units.lower() == '00': txt5_tmp1 = '(-No Units:::Pixel Aspect Ratio-)\n' elif self.s4_jfif_density_units.hex().lower() == '01': txt5_tmp1 = '(-Pixels Per Inch [2.54 cm]-)\n' elif self.s4_jfif_density_units.hex().lower() == '02': txt5_tmp1 = '(-Pixels Per Centimeter-)\n' else: txt5_tmp1 = '(?)\n' txt5 = txt1_format.format('JFIF Density Units', self.s4_jfif_density_units.hex(), txt5_tmp1) txt6 = txt1_format.format('JFIF X Density', self.s5_jfif_xdensity.hex(sep=' '), '\n') txt7 = txt1_format.format('JFIF Y Density', self.s6_jfif_ydensity.hex(sep=' '), '\n') txt8 = txt1_format.format('JFIF X Thumbnail', self.s7_jfif_xthumbnail.hex(sep=' '), '\n') txt9 = txt1_format.format('JFIF Y Thumbnail', self.s8_jfif_ythumbnail.hex(sep=' '), '\n') thumbnail_length = len(self.s9_jfif_thumbnaildata) txt2_format = "\t{:<20} : '{}" txt10 = '' for kk in range(0, thumbnail_length): if kk % 10 == 0: if kk == 0: txt10 = txt2_format.format( 'JFIF Thumbnail Data', self.s9_jfif_thumbnaildata[kk:kk + 1].hex()) else: txt10 += "'\n" + txt2_format.format( '', self.s9_jfif_thumbnaildata[kk:kk + 1].hex()) else: txt10 += ' ' + self.s9_jfif_thumbnaildata[kk:kk + 1].hex() if kk == thumbnail_length - 1: txt10 += "'" result = txt1 + txt2 + txt3 + txt4 + txt5 + txt6 + txt7 + txt8 + txt9 + txt10 return result
def __init__(self, bytesData: bytes): self.s0_app_marker = bytesData[0:2] self.s1_app_length = bytesData[2:4] self.s1_app_length_int = clength(data=self.s1_app_length) self.s2_xmp_marker = bytesData[4:33] self.s2_xmp_marker_str = 'http://ns.adobe.com/xap/1.0/\\x00' self.s3_xmp_encoding_bytes = b'' self.s3_xmp_encoding_int = -1 self.s3_xmp_encoding_hex_str = '' self.s3_xmp_encoding_str = '' self.s4_xmp_data = bytesData[33:] self.encoding()
def showHeader(self): txt1 = '\tApp Marker : ' + self.s0_app_marker.hex( sep=' ') + " '" + Kind.findType( self.s0_app_marker).shortname + "'" txt2 = '\tApp Length : ' + self.s1_app_length.hex( sep=' ') + ' (' + str(self.s1_app_length_int) + ' bayt)' txt3 = '\tExif Marker : ' + self.s2_exif_marker.hex( sep=' ') + " '" + self.s2_exif_marker_str + "'" txt4 = '\tExif Byte Order : ' + self.s3_exif_byte_order.hex( sep=' ') + " '" + self.s3_exif_byte_order.decode( encoding='Ascii', errors='replace') + "' '" + self.s3_exif_byte_order_str + "'" txt5 = '\tExif Version Number : ' + self.s4_exif_version_number.hex( sep=' ') + " (" + str(clength(self.s4_exif_version_number)) + ")" txt6 = '\tExif IFD : ' + self.s5_exif_image_file_directory_ifd.hex( sep=' ') txt7 = "\tExif 'OIFD' Tags Count : " + str( len(self.s6_exif_0IFD_3tags)) txt8 = "\tExif 'Exif IFD' Tags Count : " + str( len(self.s7_exif_ExifIFD_3tags)) txt9 = "\tExif 'Interoperability IFD' Tags Count : " + str( len(self.s8_exif_InterOperability_3tags)) txt10 = "\tExif 'GPS IFD' Tags Count : " + str( len(self.s9_exif_GpsIFD_3tags)) txt11 = "\tExif '1IFD' Tags Count : " + str( len(self.s10_exif_1IFD_3tags)) txt12 = "\t + " txt13 = "\t ----------- " txt14 = "\tExif Total Tags Count : " + str( len(self.s6_exif_0IFD_3tags) + len(self.s7_exif_ExifIFD_3tags) + len(self.s8_exif_InterOperability_3tags) + len(self.s9_exif_GpsIFD_3tags) + len(self.s10_exif_1IFD_3tags)) print(txt1) print(txt2) print(txt3) print(txt4) print(txt5) print(txt6) print() print(txt7) print(txt8) print(txt9) print(txt10) print(txt11) print(txt12) print(txt13) print(txt14)
def showAll(self): txt1_format = "\t{:<20} : '{}' {}" txt1_tmp1 = "(-" + Kind.findType( bytesData=self.s0_app_marker).shortname + "-)" txt1 = txt1_format.format('App Marker', self.s0_app_marker.hex(sep=' '), txt1_tmp1) txt2_tmp1 = '(' + str(clength(data=self.s1_app_length)) + ' bayt)' txt2 = txt1_format.format('App Length', self.s1_app_length.hex(sep=' '), txt2_tmp1) txt3 = txt1_format.format('JFIF Marker', self.s2_jfif_marker.hex(sep=' '), "'JFIF\\x00'") txt4_tmp1 = self.s3_jfif_version_1_major.hex( ) + ' ' + self.s3_jfif_version_2_minor.hex() txt4_tmp2 = '(' + str(ord(self.s3_jfif_version_1_major)) + '.' + str( ord(self.s3_jfif_version_2_minor)) + ')' txt4 = txt1_format.format('JFIF Version', txt4_tmp1, txt4_tmp2) if self.s4_jfif_density_units.lower() == '00': txt5_tmp1 = '(-No Units:::Pixel Aspect Ratio-)' elif self.s4_jfif_density_units.hex().lower() == '01': txt5_tmp1 = '(-Pixels Per Inch [2.54 cm]-)' elif self.s4_jfif_density_units.hex().lower() == '02': txt5_tmp1 = '(-Pixels Per Centimeter-)' else: txt5_tmp1 = '(?)' txt5 = txt1_format.format('JFIF Density Units', self.s4_jfif_density_units.hex(), txt5_tmp1) txt6 = txt1_format.format('JFIF X Density', self.s5_jfif_xdensity.hex(sep=' '), '') txt7 = txt1_format.format('JFIF Y Density', self.s6_jfif_ydensity.hex(sep=' '), '') txt8 = txt1_format.format('JFIF X Thumbnail', self.s7_jfif_xthumbnail.hex(sep=' '), '') txt9 = txt1_format.format('JFIF Y Thumbnail', self.s8_jfif_ythumbnail.hex(sep=' '), '') print(txt1) print(txt2) print(txt3) print(txt4) print(txt5) print(txt6) print(txt7) print(txt8) print(txt9) s2hex(dataBytes=self.s9_jfif_thumbnaildata, dataName="'JFIF Thumbnail Data'", columnSize=20)
def all(self) -> str: txt1_format = "\t{:<21} : '{}' {}\n" txt1_tmp1 = "(-" + Kind.findType( bytesData=self.s0_app_marker).shortname + "-)" txt1 = txt1_format.format('App Marker', self.s0_app_marker.hex(sep=' '), txt1_tmp1) txt2_tmp1 = '(' + str(clength(data=self.s1_app_length)) + ' bayt)' txt2 = txt1_format.format('App Length', self.s1_app_length.hex(sep=' '), txt2_tmp1) txt3 = txt1_format.format('JFXX Marker', self.s2_jfxx_marker.hex(sep=' '), "'JFXX\\x00'") if self.s3_jfxx_thumbnail_format == b'10': txt4_tmp1 = '(-JPEG format-)' elif self.s3_jfxx_thumbnail_format == b'11': txt4_tmp1 = '(-1 byte per pixel palettized format-)' elif self.s3_jfxx_thumbnail_format == b'13': txt4_tmp1 = '(-3 byte per pixel RGB format-)' else: txt4_tmp1 = '(?)' txt4 = txt1_format.format('JFXX Thumbnail Format', self.s3_jfxx_thumbnail_format.hex(), txt4_tmp1) thumbnail_length = len(self.s4_jfxx_thumbnail_data) txt2_format = "\t{:<21} : '{}" txt5 = '' for kk in range(0, thumbnail_length): if kk % 10 == 0: if kk == 0: txt5 = txt2_format.format( 'JFIF Thumbnail Data', self.s4_jfxx_thumbnail_data[kk:kk + 1].hex()) else: txt5 += "'\n" + txt2_format.format( '', self.s4_jfxx_thumbnail_data[kk:kk + 1].hex()) else: txt5 += ' ' + self.s4_jfxx_thumbnail_data[kk:kk + 1].hex() if kk == thumbnail_length - 1: txt5 += "'" result = txt1 + txt2 + txt3 + txt4 + txt5 return result
def assignExifTag(bytesData: bytes): item = exif_Tag() # item.t1_tag_1bytes = bytesData[0:2] item.t2_type_1bytes = bytesData[2:4] item.t3_count_1bytes = bytesData[4:8] item.t4_value_offset_1bytes = bytesData[8:12] # item.t2_type_2obj = exif_Data_Type.find(item.t2_type_1bytes) item.t3_count_2int = clength(item.t3_count_1bytes) item.t3_count_3baytslength = item.t3_count_2int * item.t2_type_2obj.t3_length # if item.t1_tag_1bytes == b'\x87\x69': item.t1_tag_2str = 'Exif IFD' item.t1_tag_3bool = True item.t4_value_offset_2int = 1 item.t4_value_offset_3offset_bool = True item.t4_value_offset_4type_str = 'OFFSET' elif item.t1_tag_1bytes == b'\xA0\x05': item.t1_tag_2str = 'Interoperability IFD' item.t1_tag_3bool = True item.t4_value_offset_2int = 1 item.t4_value_offset_3offset_bool = True item.t4_value_offset_4type_str = 'OFFSET' elif item.t1_tag_1bytes == b'\x88\x25': item.t1_tag_2str = 'GPS IFD' item.t1_tag_3bool = True item.t4_value_offset_2int = 1 item.t4_value_offset_3offset_bool = True item.t4_value_offset_4type_str = 'OFFSET' elif item.t3_count_3baytslength > 4: item.t4_value_offset_2int = 1 item.t4_value_offset_3offset_bool = True item.t4_value_offset_4type_str = 'OFFSET' elif item.t3_count_3baytslength <= 4: item.t4_value_offset_2int = 2 item.t4_value_offset_3offset_bool = False item.t4_value_offset_4type_str = 'VALUE' else: item.t4_value_offset_4type_str = 'UNKNOWN' return item
def __init__(self, bytesData: bytes): self.s0_app_marker = bytesData[0:2] self.s1_app_length = bytesData[2:4] self.s1_app_length_int = clength(data=self.s1_app_length) self.s2_exif_marker = bytesData[4:10] self.s2_exif_marker_str = 'Exif\\x00\\x00' self.s3_exif_byte_order = bytesData[10:12] if self.s3_exif_byte_order == b'MM': self.s3_exif_byte_order_str = 'Big Endian' self.s3_exif_byte_order_int = 1 elif self.s3_exif_byte_order == b'II': self.s3_exif_byte_order_str = 'Little Endian' self.s3_exif_byte_order_int = 2 else: self.s3_exif_byte_order_str = 'Unknown' self.s3_exif_byte_order_int = -1 self.s4_exif_version_number = bytesData[12:14] self.s5_exif_image_file_directory_ifd = bytesData[14:18] # ---- 0IFD ---- self.s6_exif_0IFD_1tags_counts = bytesData[18:20] self.s6_exif_0IFD_2tags_counts_int = clength( self.s6_exif_0IFD_1tags_counts) self.s6_exif_0IFD_3tags = [] # ---- Exif IFD ---- self.s7_exif_ExifIFD_0offset = -1 self.s7_exif_ExifIFD_1counts = b'\x00\x00' self.s7_exif_ExifIFD_2counts_int = 0 self.s7_exif_ExifIFD_3tags = [] # ---- InterOperability IFD ---- self.s8_exif_InterOperability_0offset = -1 self.s8_exif_InterOperability_1counts = b'\x00\x00' self.s8_exif_InterOperability_2counts_int = 0 self.s8_exif_InterOperability_3tags = [] # ---- GPS IFD ---- self.s9_exif_GpsIFD_0offset = -1 self.s9_exif_GpsIFD_1counts = b'\x00\00' self.s9_exif_GpsIFD_2counts_int = 0 self.s9_exif_GpsIFD_3tags = [] # ---- 1IFD (Thumbnail Exif) ---- self.s10_exif_1IFD_0offset = -1 self.s10_exif_1IFD_1counts = b'\x00\x00' self.s10_exif_1IFD_2counts_int = 0 self.s10_exif_1IFD_3tags = [] # ---- All Data ---- self.s11_data = bytesData # ######################################################################## # Find "1IFD" , "0IFD" , "Exif IFD" , "InterOperability IFD" , "GPS IFD" # ######################################################################## # ---- Define 1IFD Offset ---- jj = 20 + self.s6_exif_0IFD_2tags_counts_int * 12 ifd1_offset = self.s11_data[jj:jj + 4] if ifd1_offset != b'\x00\x00\x00\x00': ifd1_offset_int = clength(ifd1_offset) self.s10_exif_1IFD_0offset = ifd1_offset_int + 10 self.s10_exif_1IFD_1counts = self.s11_data[ self.s10_exif_1IFD_0offset:self.s10_exif_1IFD_0offset + 2] self.s10_exif_1IFD_2counts_int = clength( self.s10_exif_1IFD_1counts) # # ---- (1) Define OIFD Tags ---- for ii in range(0, self.s6_exif_0IFD_2tags_counts_int): jj = 20 + ii * 12 item = exif_Tag.assignExifTag(self.s11_data[jj:jj + 12]) # # Exif IFD if item.t1_tag_1bytes == b'\x87\x69': kk = clength(item.t4_value_offset_1bytes) self.s7_exif_ExifIFD_0offset = kk + 10 self.s7_exif_ExifIFD_1counts = self.s11_data[ self.s7_exif_ExifIFD_0offset:self.s7_exif_ExifIFD_0offset + 2] self.s7_exif_ExifIFD_2counts_int = clength( self.s7_exif_ExifIFD_1counts) # InterOperability IFD elif item.t1_tag_1bytes == b'\xA0\x05': kk = clength(item.t4_value_offset_1bytes) self.s8_exif_InterOperability_0offset = kk + 10 self.s8_exif_InterOperability_1counts = self.s11_data[ self.s8_exif_InterOperability_0offset:self. s8_exif_InterOperability_0offset + 2] self.s8_exif_InterOperability_2counts_int = clength( self.s8_exif_InterOperability_1counts) # GPS IFD elif item.t1_tag_1bytes == b'\x88\x25': kk = clength(item.t4_value_offset_1bytes) self.s9_exif_GpsIFD_0offset = kk + 10 self.s9_exif_GpsIFD_1counts = self.s11_data[ self.s9_exif_GpsIFD_0offset:self.s9_exif_GpsIFD_0offset + 2] self.s9_exif_GpsIFD_2counts_int = clength( self.s9_exif_GpsIFD_1counts) else: # find tag func if not item.t1_tag_3bool: item.t1_tag_2str = ftag(item.t1_tag_1bytes) self.s6_exif_0IFD_3tags.append(item) # # ---- (2) Define Exif IFD ---- for ii in range(0, self.s7_exif_ExifIFD_2counts_int): jj = (self.s7_exif_ExifIFD_0offset + 2) + ii * 12 # item = exif_Tag.assignExifTag(self.s11_data[jj:jj + 12]) # # find Tag item.t1_tag_2str = ftag(item.t1_tag_1bytes) # self.s7_exif_ExifIFD_3tags.append(item) # # ---- (2) Define InterOperability IFD ---- for ii in range(0, self.s8_exif_InterOperability_2counts_int): jj = (self.s8_exif_InterOperability_0offset + 2) + ii * 12 # item = exif_Tag.assignExifTag(self.s11_data[jj:jj + 12]) # # find Tag item.t1_tag_2str = ftag(item.t1_tag_1bytes) # self.s8_exif_InterOperability_3tags.append(item) # # ---- (3) Define GPS IFD ---- for ii in range(0, self.s9_exif_GpsIFD_2counts_int): jj = (self.s9_exif_GpsIFD_0offset + 2) + ii * 12 # item = exif_Tag.assignExifTag(self.s11_data[jj:jj + 12]) # # find Tag item.t1_tag_2str = fgtag(item.t1_tag_1bytes) # self.s9_exif_GpsIFD_3tags.append(item) # # ---- (4) Define 1IFD ---- for ii in range(0, self.s10_exif_1IFD_2counts_int): jj = (self.s10_exif_1IFD_0offset + 2) + ii * 12 # item = exif_Tag.assignExifTag(self.s11_data[jj:jj + 12]) # # find Tag item.t1_tag_2str = ftag(item.t1_tag_1bytes) # self.s10_exif_1IFD_3tags.append(item)
def __init__(self, bytesData: bytes): self.s0_app_marker = bytesData[0:2] self.s1_app_length = bytesData[2:4] self.s1_app_length_int = clength(data=self.s1_app_length) self.s2_all_data = bytesData