2010-10-25 35 views
1

好的。長話短說。一旦我可以將該字符串保存爲圖像,其他時間我可以'

我的相機具有拍攝照片的方法,這就是它返回:

[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

你爲什麼不乾脆將圖像保存爲,而不是二進制數據? – bzlm 2010-10-25 18:28:43

+0

你在哪裏使用我的塊? – 2010-10-25 18:39:30

+0

您能否詳細說明如何將圖像保存到文本文件?如果您尚未這樣做,則可能需要base64對數據進行編碼,然後再將其寫入文本。 – vezult 2010-10-25 18:47:31

回答

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抓取一行。

+0

我認爲這不是問題。該文本文件只有一行。並且使用read()而不是readline()不會有幫助。 – 2010-10-25 18:35:12

+0

你是怎麼寫這個文件的? – adw 2010-10-25 18:41:52

+1

請試試看。你有二進制數據。有256個機會中的任何一個字節將編碼爲字符代碼10,一個換行符。鑑於你的數據比256個字符長得多,你幾乎可以保證那裏有換行符。 – 2010-10-25 18:46:54

3

也許你應該閱讀和使用二進制模式類似這樣的寫入文件:在數據

open('file_name', 'wb') 
open('file_name', 'rb') 
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'寫了4個字符,當打算使用單個字符\x81時。

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() 
相關問題