我得到了这个学校项目,目标是拍照,应用RLE方法以便将其压缩为二进制文件(.txt),并节省一些空间。经过3天的苦苦挣扎,现在我遇到了麻烦。
def lecture_fichier_compresse():
f2=open("data2.txt",'rb') #open a binary file in reading mod.
im3=zeros((962,800,3),dtype="uint8") #create picture which size is 962*800 where every pixels are coded on 3 bytes.
d=0#pixel counter
i=0#lign indexation
j=0#column indexation
b=ord(f2.read(1))# the informations are read a first time
a=ord(f2.read(1))
rouge=ord(f2.read(1))
vert=ord(f2.read(1))
bleu=ord(f2.read(1))
while i!=im3.shape[0]: #as long as it doesn't reach the final lign
if d<=(a+b*255):
im3[i,j,0] = rouge
im3[i,j,1] = vert
im3[i,j,2] = bleu
d+=1
j+=1
if j==im3.shape[1]:
j=0
i+=1
else: #resets pixel counter and starts reading next informations
d=0
b=ord(f2.read(1))
a=ord(f2.read(1))
rouge=ord(f2.read(1))
vert=ord(f2.read(1))
bleu=ord(f2.read(1))
f2.close()
imsave("Copie_compresse.bmp",im3)
return im3
imshow(lecture_fichier_compresse());show()
当我执行pgrm时,它会给我写在标题中的错误。我觉得这是不可能纠正的,因为它以十六进制形式书写。
这是更多信息:
这里不使用字节对像素进行编码,就像我们通常对.bmp这样的格式进行编码一样。
在这里,RLE将通过比较3种颜色来搜索同一轮廓上的相同像素,并计算遇到该像素的次数。最后,它比RGB的字节多存储了两个字节:a和b。
a是像素数。
b是255个像素堆叠的数量。 (因为我将数据编码为8位,并且图片通常大于255 * 255尺寸)
最佳答案
您的文件太短,数据用完了。找到EOF时,file.read(..)
返回一个空字符串。也许您剩余的字节应该保留为0?
您正在极其低效地读取数据。使用struct
module将数据解压缩为整数,并创建一个由(R,G,B)三元组组成的单个长numpy数组,然后对数据进行整形以形成图像矩阵:
import numpy as np
import struct
def lecture_fichier_compresse():
width, height = 800, 962
with open("data2.txt", 'rb') as rle_data:
image = np.zeros((width * height, 3), dtype="uint8")
pos = 0
# decompress RLE data; 2 byte counter followed by 3 RGB bytes
# read until the file is done
for data in iter(lambda: rle_data.read(5), ''):
if len(data) < 5:
# not enough data to store another RLE RGB chunk
break
count, r, g, b = struct.unpack('>HBBB', data)
image[pos:pos + count, :] = [[r, g, b]] * count
pos += count
# reshape continuous stream into an image matrix
image = image.reshape((height, width, 3))
imsave("Copie_compresse.bmp",im3)
return image
就是说,使用您的示例文件数据,我似乎无法构建连贯的图像。解压缩可生成695046像素的数据,而无法生成连贯的矩形图像(将数字分解成的最大短尺寸为66,因此非常细长)。即使最后允许丢失数据,我似乎也找不到能够产生连贯图像的长宽比。结论是您的输入数据不完整或不正确。