Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PIL Image.tostring()_Python_Python Imaging Library_Pyopengl - Fatal编程技术网

Python PIL Image.tostring()

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像素的补丁。然而,它不是预期的图像——它看起来像是从随机内存中提取像素。随机记忆假设得到了一个事实的支持,即即使我试图画完全不同的图像

我是Python和PIL的新手。我正在尝试按照代码示例介绍如何通过PIL将图像加载到Python中,然后使用openGL绘制其像素。下面是一些代码行:

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