我是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。
答案 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调用实际上是在绘制随机内存。