4

我是 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 和 pyopenGL 和 PIL 的 2.7 版本。

截屏

4

3 回答 3

9

我想你很接近。尝试:

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

图像首先必须转换为 RGBA 模式才能使 RGBA rawmode 打包程序可用(请参阅libimaging中的 Pack.c)。你可以检查一下len(pBits) == im.size[0]*im.size[1]*4,你的gloves200图像是200x200x4 = 160,000字节。

于 2011-07-20T06:57:55.030 回答
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))
于 2011-07-20T04:48:30.377 回答
0

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

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

于 2011-07-20T18:46:37.110 回答