【发布时间】:2017-12-26 21:37:09
【问题描述】:
我得到了这个学校项目,其目标是拍照,应用 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 个级别的颜色来搜索同一 lign 上的相同像素,并计算它遇到它的次数。最后,它存储在比 RGB 字节多的两个字节中:a 和 b。 a 是像素数。 b 是 255 个像素堆栈的数量。 (因为我将数据编码为 8 位并且图片通常大于 255*255 大小)
【问题讨论】:
-
该错误表明您的一个
f2.read(1)调用返回了一个空字符串;当您到达文件末尾时会发生这种情况。 -
那么,我该如何预防呢?
-
没有实际的文件输入数据,很难说。您的文件包含的信息不如您预期的那么多。
-
此外,我想分享文件数据2,向大家展示它是如何卡住的。有谁知道我可以存储该二进制文件的网站吗?
-
您真的很想研究
structmodule,并避免如此多的单个字节读取和ord()调用。使用该模块从 2 个字节中读取整数是微不足道的。