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