一旦我可以将此字符串保存为图像,其他时间我可以'

时间:2010-10-25 18:25:40

标签: python image-processing

确定。长话短说。

我的相机有一种拍照的方法,这就是它的回报:

[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

3 个答案:

答案 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")

我确认您是正确的,readreadline在这里没有任何区别,但我仍然建议使用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()