]>
vgcfreebox.myrthtech.pt Git - ue-ccd-compressaodeimagensbinarias.git/blob - lz78/lz_78_2x2.py
4 ########################################################################################
7 # python lz_78_2x2.py <caminho_para_o_ficheiro_original>
10 # Os ficheiros gerados ficarão na mesma pasta que o script
11 ########################################################################################
13 def lz78_compression(image
):
19 if (symbol
+ i
) in dictionary
.values():
24 dictionary
[len(dictionary
)] = i
26 idx
= list(dictionary
.keys())[list(dictionary
.values()).index(symbol
)]
27 output
.append([idx
, i
])
28 dictionary
[len(dictionary
)] = symbol
+ i
32 idx
= list(dictionary
.keys())[list(dictionary
.values()).index(symbol
)]
33 output
.append([idx
, ""])
35 return output
, dictionary
37 def clean_image_data(image_data
):
39 for line
in image_data
:
40 line
= line
.strip().replace(" ", "")
41 if not line
or line
.startswith('#'):
46 def chunkstring(string
, length
):
47 return [string
[i
: length
+i
] for i
in range(0, len(string
), length
)]
49 def get_blocks(bitstream
, largura
, altura
):
50 matriz
= [bitstream
[i
*largura
:(i
+1)*largura
] for i
in range(altura
)]
53 matriz
= [linha
+ '0' for linha
in matriz
]
56 matriz
.append('0' * largura
)
60 for r
in range(0, altura
, 2):
61 for c
in range(0, largura
, 2):
62 bloco
= matriz
[r
][c
] + matriz
[r
][c
+1] + matriz
[r
+1][c
] + matriz
[r
+1][c
+1]
64 return blocos
, largura
, altura
67 with open(sys
.argv
[1], "r") as image
:
68 lines
= image
.readlines()
69 image_size
= lines
[1].split()
71 if lines
[0].strip() != 'P1':
72 raise ValueError("This is not a pbm file")
74 largura_orig
= int(image_size
[0])
75 altura_orig
= int(image_size
[1])
77 clean_text
= clean_image_data(lines
[2:])
79 image_blocks
, largura_pad
, altura_pad
= get_blocks(clean_text
, largura_orig
, altura_orig
)
81 output
, dic
= lz78_compression(image_blocks
)
83 with open(sys
.argv
[1] + "_compressed", "w") as save_file
:
84 save_file
.write(f
"{output}\n{largura_orig} {altura_orig} {largura_pad} {altura_pad}")
86 with open(sys
.argv
[1] + ".bin", "wb") as save_file
:
87 save_file
.write(struct
.pack('IIII', largura_orig
, altura_orig
, largura_pad
, altura_pad
))
88 for indice
, simbolo
in output
:
89 simbolo_val
= int(simbolo
, 2) if simbolo
!= "" else 16
90 save_file
.write(struct
.pack('HB', indice
, simbolo_val
))