2012-10-02 133 views
1

我在使用PIL從STDIN讀取png圖像時出現問題。當圖像由PIL寫入時,全部爲scrambled,但是如果我使用簡單文件打開寫入文件,則寫入並關閉文件將保存爲perfectlyPython PIL從STDIN讀取PNG

我有一個程序,可以將png文件轉儲到標準輸出中,不需要壓縮,我使用一個python腳本讀取數據流,讀取數據並在幾乎每個png上執行一些例程。轉儲數據的程序寫入某個字符串分隔符的PNG文件,該字符串是"{fim:FILE_NAME.png}"

劇本是這樣的:

import sys 
import re 
from PIL import Image 

png = None 

for linha in sys.stdin: 
    if re.search('{fim:', linha): 
     fname = linha.replace('{fim:','')[:-2] 

     # writes data directly to file, works fine 
     #f = open("/tmp/%s" % fname , 'w') 
     #f.write(png) 
     #f.close() 

     # create a PIL Image from data and writes to disk, fails fine 
     im = Image.frombuffer("RGB",(640,480),png, "raw", "RGB", 0, 1) 
     #im = Image.fromstring("RGB",(640,480),png) 
     im.save("/tmp/%s" % fname) 

     png = None 

    else: 
     if png is None: 
      png = linha 
     else: 
      png+= linha 

ImageMagick的從錯誤的圖像識別/tmp/1349194042-24.png PNG 640×480 640×480 + 0 + 0 8位DirectClass 361KiB 0.010u 0:00.019

ImageMagick的IDE ntify從工作圖像:

/tmp/1349194586-01.png PNG 640×480 640×480 + 0 + 0 8位DirectClass 903KiB 0.010u 0:00.010

沒有任何一個有一個想法發生什麼事?這是關於小/大端的東西嗎?我試過Image.frombufferImage.fromstring,不同的模式,但沒有。似乎有關於PIL期望的緩衝區的更多信息。

謝謝,

+0

您是否收到*像素*或* PNG的圖片*'stdin'?您的解碼器試圖將輸入解碼爲RGB像素,並且將忽略PNG頭(等等)。 – nneonneo

回答

3

如果png變量包含來自PNG文件的二進制數據,則無法使用frombuffer讀取它:用於讀取原始像素數據。相反,使用StringIOImage.open,即:

img = Image.open(StringIO.StringIO(png)) 
0

png變量未初始化第一次調用到Image.frombuffer()。你需要將它初始化爲stdin的東西。我不確定您使用for linha in sys.stdin:。這給你線路緩衝輸入。您可能想要使用大小爲N的塊緩衝輸入,如sys.stdin.read(N)。這將讀取特定數量的字節,然後可以解析數據,如剪切文件名分隔符並填充Image.frombuffer()的輸入緩衝區。

+0

實際上,png是在循環外部定義的,並在第一個「else」中填充。包含字符串「{fim:」的行出現在png文件的每一端。邏輯本身已被糾正。問題是PIL如何管理數據。 – Zanaca