Python PIL 图像.tostring()

4

我是Python和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像素的区域。然而,这并不是预期的图像--它看起来像是从随机内存中绘制像素。从事实上支持这种随意内存假说的是,即使当我尝试绘制完全不同的图像时,我也得到相同的图案。能有人帮帮我吗?我正在使用Python 2.7和Windows XP上的pyopenGL和PIL的2.7版本。
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字节。

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))

当我运行你的代码片段时,.tostring函数给我返回了一个错误信息:"return apply(encoder, (mode,) + args + extra) SystemError: unknown raw mode"。 - ahoffer
在我的代码片段中添加了一个解决方法,该解决方法可以在http://www.java2s.com/Open-Source/Python/GUI/Python-Image-Library/Imaging-1.1.7/PIL/ImageQt.py.htm上找到。 - mikebabcock
谢谢您的解决方案。是什么兼容性问题?我是在新版本的库上运行旧的示例代码吗? - ahoffer

0

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

我找到了我的错误,这是Python新手的错误。哎呀。我在模块中声明了一些变量,超出了任何函数的范围,并天真地认为我正在修改它们在函数内的值。当然,那行不通,所以我的glDrawPixels调用实际上正在绘制随机内存。


我只从PIL中导入了Image类。现在当我执行以下语句时不会出现错误:pBits = im.convert('RGBA').tostring()。我无法弄清楚为什么。是否存在命名空间冲突?tostring()是某种全局函数还是在某个类层次结构的顶部定义的? - ahoffer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接