确定。长话短说。
我的相机有一种拍照的方法,这就是它的回报:
[160, 120, 3, 10, 1287848024, 96181, 'super long image string']
我能够解码字符串并在我调用这样的方法之后将其保存为图像:
for i in range(0, 10):
image = camProxy.getImageRemote(nameId)
imageWidth = image[0]
imageHeight = image[1]
imageByteArray = image[6]
im = Image.fromstring("YCbCr",(imageWidth,imageHeight),imageByteArray)
fileName = str(time.time())+".jpg"
im.save(fileName, "JPEG")
这很好用,我可以打开保存的图像。
但是,如果我只是将字符串保存到txt文件中,之后我想加载它并保存为图像:
f = open("rawImage.txt", "r")
data = f.readline()
f.close()
# save as image
im = Image.frombuffer("YCbCr",(160,120),data)
im.save("test.jpg", "JPEG")
我得到的几乎是完全绿色的图像。
以下是我遇到问题的示例字符串:
http://richardknop.com/rawImage.txt
以下是该图像的相机的getImageRemote()方法的完整输出:
http://richardknop.com/log.txt
任何人都有想法会出现什么问题?这是与编码有关的一些问题吗?所有文件都保存为ASCII,但我也尝试将它们全部保存为UTF-8。
编辑:
我是如何将图像写入文件的?我只是重定向了脚本的输出:
python script.py > output.txt
在我的剧本中:
print imageByteArray
答案 0 :(得分:6)
我通过将文件模式从"r"
更改为"rb"
来实现它。
这是工作代码:
import time
import Image
image_data = [160, 120, 3, 10, 1287848024, 96181, 'really long string from http://richardknop.com/log.txt']
imageWidth = image_data[0]
imageHeight = image_data[1]
imageByteArray = image_data[6]
fout = open("image_data.txt", "wb")
fout.write(imageByteArray)
fout.close()
fin = open("image_data.txt", 'rb')
image_string = fin.read()
fin.close()
im = Image.fromstring("YCbCr",(imageWidth,imageHeight),image_string)
fileName = str(time.time())+".jpg"
im.save(fileName, "JPEG")
我确认您是正确的,read
和readline
在这里没有任何区别,但我仍然建议使用read
,因为这说明了您的意思。
这是我的原始答案:
将data = f.readline()
更改为data = f.read()
。 read
抓取整个文件,readline
只抓取一行。
答案 1 :(得分:3)
也许您应该使用二进制模式读取和写入您的文件,如下所示:
open('file_name', 'wb')
open('file_name', 'rb')
答案 2 :(得分:1)
读入数据:
import Image
import ast
with open('rawImage.txt','r') as f:
raw_data=f.read()
with open('log.txt','r') as f:
log_data=f.read()
log_data=ast.literal_eval(log_data)
imageWidth=log_data[0]
imageHeight=log_data[1]
log_data=log_data[6]
让我们试着看看raw_data
(来自rawImage.txt)是否与...相同
log_data
(来自log.txt)。糟糕:它们的长度不一样:
print(len(raw_data))
# 146843
print(len(log_data))
# 57600
看一下两个字符串的开头。当单个字符raw_data
出现时,似乎\x81
为'\ x81'写了4个字符。
print(list(raw_data[:10]))
# ['6', '}', '\\', 'x', '8', '1', '8', '}', '\\', 'x']
print(list(log_data[:10]))
# ['6', '}', '\x81', '8', '}', '\x81', '7', '\x90', '\x8a', '4']
这可能发生了,因为rawImage.txt是以书写模式'w'
而不是'wb'
打开的。最好的解决方案是使用正确的写入模式编写rawImage.txt,如Steven Rumbalski does here。
但考虑到这种困境,这里有一种方法可以解决它:
raw_data_fixed=raw_data.decode('string_escape')
现在可行:
im = Image.fromstring("YCbCr",(imageWidth,imageHeight),raw_data_fixed)
im.show()