Python速记值太多,无法解包错误

Python速记值太多,无法解包错误,python,error-handling,png,Python,Error Handling,Png,我得到的错误值太多,无法解压缩(预期为3个)。 当我添加[]以防它本身是一个元组时,我得到的错误是没有足够的值来解包(预期为3,得到1) 第50行出现错误,r,g,b=hex2rgb(newpix) 我将分享整个代码,因为我不确定这是否是我得到的唯一错误 我的目标是在.png文件中插入一个字符串。 大约10年前,我曾使用python,我是一名C#用户,所以请原谅,如果这是一个问题,那就太离谱了 多谢各位 另外,我不太擅长表达自己,请随意编辑帖子 from PIL import Image imp

我得到的错误
值太多,无法解压缩(预期为3个)
。 当我添加
[]
以防它本身是一个元组时,我得到的错误是
没有足够的值来解包(预期为3,得到1)
第50行出现错误,
r,g,b=hex2rgb(newpix)

我将分享整个代码,因为我不确定这是否是我得到的唯一错误

我的目标是在.png文件中插入一个字符串。 大约10年前,我曾使用python,我是一名C#用户,所以请原谅,如果这是一个问题,那就太离谱了

多谢各位 另外,我不太擅长表达自己,请随意编辑帖子

from PIL import Image
import binascii
import optparse

def rgb2hex(r, g, b):
    return '#{:02x}{:02x}{:02x}'.format(r, g, b)

def hex2rgb(hexcode):
    return tuple(map(ord, hexcode[1:]))

def str2bin(message):
    binary = bin(int(binascii.hexlify(message.encode()), 16))
    return binary[2:]

def bin2str(binary):
    message = binascii.unhexlify('%x' % (int('0b' + binary, 2)))
    return message

def encode(hexcode, digit):
    if hexcode[-1] in ('0', '1', '2', '3', '4', '5'):
        hexcode = hexcode[:-1] + digit
        return hexcode
    else:
        return None


def decode(hexcode):
    if hexcode[-1] in ('0', '1'):
        return hexcode[-1]
    else:
        return None


def hide(filename, message):
    img = Image.open(filename)
    binary = str2bin(message) + '1111111111111110'
    if img.mode in ('RGBA'):
        img = img.convert('RGBA')
        datas = img.getdata()

        newData = []
        digit = 0
        temp = ''
        for item in datas:
            if (digit < len(binary)):
                newpix = encode(rgb2hex(item[0], item[1], item[2]), binary[digit])
                if newpix == None:
                    newData.append(item)
                else:
                    r, g, b = [hex2rgb(newpix)]
                    newData.append((r, g, b, 255))
                    digit =+ 1
            else:
                newData.append(item)
        img.putdata(newData)
        img.save(filename, "PNG")
        return "Completed!"
    return "Incorrect Image mode, couldn't hide"

def retr(filename):
    img = Image.open(filename)
    binary = ''

    if img.mode in ('RGBA'):
        img = img.convert('RGBA')
        datas = img.getdata()

        for item in datas:
            digit = decode(rgb2hex(item[0], item[1], item[2]))
            if digit == None:
                pass
            else:
                binary = binary + digit
                if (binary[-16:] == '1111111111111110'):
                    print("Success")
                    return bin2str(binary[:-16])
        return bin2str(binary)
    return "Incorrect Image mode, couldn't retrieve"

def Main():
    parser = optparse.OptionParser('usage %prog ' + '-e/-d <target file>')
    parser.add_option('-e', dest = 'hide', type = 'string', help = 'target picture path to hide text')
    parser.add_option('-d', dest = 'retr', type = 'string', help = 'target picture to retrieve text')
    (options, args) = parser.parse_args()
    if (options.hide != None):
        text = input("Enter a message to hide: ")
        print(hide(options.hide, text))
    elif(options.retr != None):
        print(retr(optrions.retr))
    else:
        print(parser.usage)
        exit(0)

if __name__ == '__main__':
    Main()
从PIL导入图像
导入binascii
导入optpass
def rgb2hex(r、g、b):
返回'{:02x}{:02x}{:02x}'。格式(r,g,b)
def hex2rgb(hexcode):
返回元组(映射(ord,hexcode[1:]))
def str2bin(信息):
binary=bin(int(binascii.hexlify(message.encode()),16))
返回二进制[2:]
def bin2str(二进制):
message=binascii.unexlify(“%x%”(int('0b'+binary,2)))
回信
def编码(十六进制代码,数字):
如果('0','1','2','3','4','5')中的hexcode[-1]:
hexcode=hexcode[:-1]+位数
返回十六进制码
其他:
一无所获
def解码(hexcode):
如果('0','1')中的hexcode[-1]:
返回hexcode[-1]
其他:
一无所获
def隐藏(文件名、消息):
img=Image.open(文件名)
二进制=str2bin(消息)+“1111111110”
如果img.mode处于('RGBA'):
img=img.convert('RGBA')
datas=img.getdata()
newData=[]
数字=0
温度=“”
对于数据中的项目:
如果(数字
这里我使用您的
hex2rgb()
函数,而不将输出分配给任何变量。它返回6个值,正如您所期望的那样,因为您将每个字符从十六进制值(
a
)解码为对应于十六进制
a
97
的整数unicode码点。()

如您所见,同时转换
AB
将返回正确的值(171)。有关如何执行此操作的示例,请参见。为此,请修改您的
hex2rgb()


最后但并非最不重要的一点是,您使用
ord()
将字符解码为整数的方法很有趣,但可能不正确,因为
A
A
具有不同的unicode代码点值(
A=65
A=97
),因此它们会为您的颜色生成不同的值。在十六进制颜色代码中,大写字母和小写字母之间没有区别。如上所述,当您将方法与
int()
一起使用时,小写或大写字符的结果将是相同的,因此更加正确。

您能否更具体地说明在代码中的何处出现此错误?如果你能给我们提供你收到的准确的错误信息,那会有帮助的。它在调用hex2rgb函数时上升
>>> hex2rgb('#abcdef')
(97, 98, 99, 100, 101, 102)
>>> r,g,b = hex2rgb('#abcdef')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)
>>> r,g,b = [hex2rgb('#abcdef')]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 1)
>>> int("0xAB",0)
171