]>
vgcfreebox.myrthtech.pt Git - ue-ccd-compressaodeimagensbinarias.git/blob - lz78/lz_78_rle.py
4 ########################################################################################
7 # python lz_78_rle.py <caminho_para_o_ficheiro_original>
10 # Os ficheiros gerados ficarão na mesma pasta que o script
11 ########################################################################################
13 def rle_transform(bitstream
):
15 pixel_atual
= '0' # Começa sempre com o pixel 0 conforme enunciado
19 if bit
== pixel_atual
:
20 if contador
== 255: # Limite de 8 bits
22 sequencia
.append(0) # Troço de 0 do outro pixel para continuar no mesmo [cite: 41]
27 sequencia
.append(contador
)
30 sequencia
.append(contador
)
33 def lz78_compression(image_data
):
40 dict_values
= list(dictionary
.values())
41 if temp
in dict_values
:
46 dictionary
[len(dictionary
)] = [i
]
48 idx
= dict_values
.index(symbol
)
49 output
.append([idx
, i
])
50 dictionary
[len(dictionary
)] = symbol
+ [i
]
54 idx
= list(dictionary
.values()).index(symbol
)
55 output
.append([idx
, -1])
58 def clean_image_data(image_data
):
62 for line
in image_data
:
64 line
= line
.replace(" ", "")
65 if not line
or line
.startswith('#'):
71 def chunkstring(string
, length
):
72 return [string
[i
: length
+i
] for i
in range(0, len(string
), length
)]
75 with open(sys
.argv
[1], "r") as image
:
76 lines
= image
.readlines()
77 image_size
= lines
[1].split()
79 if lines
[0].strip() != 'P1':
80 raise ValueError("This is not a pbm file")
82 clean_text
= clean_image_data(lines
[2:]) #Limpa os espaços em branco para comprimir melhor
84 clean_text
= rle_transform(clean_text
)
86 output
= lz78_compression(clean_text
)
88 print(f
"Output: {output}\n")
90 #Compressão em texto (human-readable)
91 with open(sys
.argv
[1] + "_compressed", "w") as save_file
:
92 save_file
.write(f
"{output} \n{image_size[0]} {image_size[1]}")
94 #Compressão em binário (compressão "a sério")
95 with open(sys
.argv
[1] + ".bin", "wb") as save_file
:
96 largura
= int(image_size
[0])
97 altura
= int(image_size
[1])
98 save_file
.write(struct
.pack('II', largura
, altura
))
100 for indice
, val
in output
:
101 simbolo_byte
= val
if val
!= -1 else 255
102 save_file
.write(struct
.pack('HB', indice
, simbolo_byte
))