Python PIL Image.tostring()
我是Python和PIL的新手。我正在尝试按照代码示例介绍如何通过PIL将图像加载到Python中,然后使用openGL绘制其像素。下面是一些代码行:Python PIL Image.tostring(),python,python-imaging-library,pyopengl,Python,Python Imaging Library,Pyopengl,我是Python和PIL的新手。我正在尝试按照代码示例介绍如何通过PIL将图像加载到Python中,然后使用openGL绘制其像素。下面是一些代码行: from Image import * im = open("gloves200.bmp") pBits = im.convert('RGBA').tostring() 这将在画布上绘制一个200 x 200像素的补丁。然而,它不是预期的图像——它看起来像是从随机内存中提取像素。随机记忆假设得到了一个事实的支持,即即使我试图画完全不同的图像
from Image import *
im = open("gloves200.bmp")
pBits = im.convert('RGBA').tostring()
这将在画布上绘制一个200 x 200像素的补丁。然而,它不是预期的图像——它看起来像是从随机内存中提取像素。随机记忆假设得到了一个事实的支持,即即使我试图画完全不同的图像,我也会得到相同的模式。有人能帮我吗?我正在WindowsXP上使用Python2.7和pyopenGL和PIL的2.7版本
您是否尝试过直接在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))
我想你很接近。尝试:
pBits = im.convert("RGBA").tostring("raw", "RGBA")
首先必须将图像转换为RGBA模式,以便RGBA rawmode打包器可用(请参见libimaging中的)。您可以检查
len(pBits)=im.size[0]*im.size[1]*4
,这是您的gloves200图像的200x200x4=160000字节。谢谢您的帮助。感谢mikebabcock在Web上更新示例代码。感谢eryksun提供的代码片段——我在代码中使用了它
我确实发现了我的错误,这是Python新手的错误。哎哟我在模块中任何函数的作用域之外声明了一些变量,天真地认为我在函数中修改它们的值。当然,这不起作用,因此我的glDrawPixels调用实际上是在绘制随机内存。当我运行代码段时,.tostring函数给了我这个错误“return apply(encoder,(mode,)+args+extra)SystemError:unknown raw mode”。在上面的代码段中添加了一个解决方法谢谢您的解决方法。兼容性问题是什么。我是否在新版本的库上运行旧的示例代码?这太棒了。多谢各位-AaronI仅从PIL导入图像类。现在我在执行时没有收到错误:pBits=im.convert('RGBA')。tostring()我不知道为什么。什么是名称空间冲突?tostring()是某种全局函数还是在某些类层次结构的顶部定义的?
pBits = im.convert("RGBA").tostring("raw", "RGBA")