Python PIL 图像编码字符串

2024-04-26 04:55:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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版本。

screen shot


Tags: 代码from图像imageimport示例pil绘制
3条回答

我觉得你很亲近。尝试:

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

为了使RGBA rawmode打包程序可用,首先必须将图像转换为RGBA模式(请参见libimaging中的Pack.c)。您可以检查len(pBits) == im.size[0]*im.size[1]*4,对于gloves200图像,它是200x200x4=160000字节。

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

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

你试过直接在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))

相关问题 更多 >