2011-07-20 83 views
4

我是Python和PIL的新手。我試圖關注如何通過PIL將圖像加載到Python的代碼示例,然後使用openGL繪製其像素。這裏有一些行的代碼:Python PIL Image.tostring()

from Image import * 
im = open("gloves200.bmp") 
pBits = im.convert('RGBA').tostring() 

.....

glDrawPixels(200, 200, GL_RGBA, GL_UNSIGNED_BYTE, pBits) 

這將在畫布上繪製像素的200×200的補丁。但是,它不是預期的圖像 - 它看起來像是從隨機存儲器中繪製像素。隨機記憶假設得到了這樣一個事實的支持,即使我試圖繪製完全不同的圖像時,我也能得到相同的圖案。可以有人幫助我嗎?我在Windows XP上使用Python 2.7和2.7版本的pyopenGL和PIL。

screen shot

回答

8

我覺得你很接近。嘗試:

pBits = im.convert("RGBA").tostring("raw", "RGBA") 

圖像首先必須轉換爲RGBA模式,以使RGBA rawmode封隔器是可用的(參見libimaging Pack.c)。您可以檢查len(pBits) == im.size[0]*im.size[1]*4,這是200x200x4 = 160,000字節爲您的gloves200圖像。

+0

太棒了。謝謝。 -Aonon – ahoffer

1

您是否嘗試過使用直接ToString函數裏面的轉換?

im = open("test.bmp") 
imdata = im.tostring("raw", "RGBA", 0, -1) 
w, h = im.size[0], im.size[1] 
glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, imdata) 

或者使用兼容版本:

try: 
     data = im.tostring("raw", "BGRA") 
except SystemError: 
     # workaround for earlier versions 
     r, g, b, a = im.split() 
     im = Image.merge("RGBA", (b, g, r, a)) 
+0

當我運行你的代碼片段時,.tostring函數給了我這個錯誤「return apply(encoder,(mode,)+ args + extra)SystemError:unknown raw mode」。 – ahoffer

+0

在http://www.java2s.com/Open-Source/Python/GUI/Python-Image-Library/Imaging-1.1.7/PIL/ImageQt.py.htm上添加了一個解決方法,以上我的片段 – mikebabcock

+0

謝謝爲解決問題。什麼是兼容性問題。我是否在較新版本的庫上運行舊示例代碼? – ahoffer

0

謝謝你的幫助。感謝mikebabcock更新Web上的示例代碼。感謝代碼片段中的eryksun--我在代碼中使用了它。

我確實發現我的錯誤,它是Python newb錯誤。哎喲。我在模塊中的任何函數的範圍之外聲明瞭一些變量,並且天真地認爲我正在函數內修改它們的值。當然,這不起作用,所以我的glDrawPixels調用實際上是在繪製隨機存儲器。

+0

我只從PIL導入了Image類。現在我在執行時沒有遇到錯誤:pBits = im.convert('RGBA')。tostring()我找不出原因。有什麼命名空間相撞?是tostring()某種全局函數還是定義在某個類層次結構的頂部? – ahoffer