TypeError:ord()需要一个字符,但找到长度为0的字符串

问题描述 投票:2回答:1

我得到了这个学校项目,其目标是拍照,应用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时,它给了我这个用tittle写的错误。这是我觉得无法纠正的事情,因为它是用十六进制写的。

这里有进一步的信息:像素这里没有使用字节编码,就像我们通常在.bmp这样的格式上做的那样。在这里,RLE将通过比较3个级别的颜色,在同一个木板上搜索同心像素,并计算它遇到它的次数。最后,它存储了比RGB更多的两个字节:a和b。 a表示像素数。 b是255个像素堆的数量。 (因为我将数据编码为8位,而且图片通常大于255 * 255大小)

python image ord
1个回答
2
投票

您的文件太短,数据耗尽。当找到EOF时,file.read(..)返回一个空字符串。也许你剩下的字节应该只剩下0?

您正在以极低的效率读取数据。使用struct module将数据解压缩为整数,并创建一个长的numpy数组(R,G,B)三元组,然后重新整形数据以形成图像矩阵:

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,因此非常细长)。即使最后允许丢失数据,我似乎也找不到产生连贯图像的任何宽高比。结论是您的输入数据不完整或不正确。

© www.soinside.com 2019 - 2024. All rights reserved.