Python PIL Image.tostring()

时间:2011-07-20 03:52:22

标签: python python-imaging-library pyopengl

我是Python和PIL的新手。我试图关注如何通过PIL将图像加载到Python,然后使用openGL绘制其像素的代码示例。以下是代码的一些部分:

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

.....

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

这将在画布上绘制一个200 x 200的像素块。但是,它不是预期的图像 - 看起来它是从随机存储器中绘制像素。随机记忆假设得到以下事实的支持:即使我试图绘制完全不同的图像,我也会得到相同的模式。有人可以帮助我吗?我在Windows XP上使用Python 2.7和2.7版本的pyopenGL和PIL。

screen shot

3 个答案:

答案 0 :(得分:8)

我觉得你很亲密。尝试:

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

首先必须将图像转换为RGBA模式,以便RGBA原始模式打包器可用(请参阅libimaging中的Pack.c)。您可以检查len(pBits) == im.size[0]*im.size[1]*4,即200x200x4 = 160,000字节的手套200图像。

答案 1 :(得分: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))

答案 2 :(得分:0)

感谢您的帮助。感谢mikebabcock更新Web上的示例代码。感谢eryksun的代码片段 - 我在我的代码中使用它。

我确实发现了我的错误,这是Python newb的错误。哎哟。我在模块中的任何函数范围之外声明了一些变量,天真以为我在函数中修改了它们的值。当然,这不起作用,所以我的glDrawPixels调用实际上是在绘制随机内存。