Python PIL Image.tostring()使用方法
我刚开始学习Python和PIL(Python图像库)。我正在尝试按照代码示例,将一张图片加载到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。
3 个回答
0
感谢大家的帮助。特别感谢mikebabcock更新了网上的示例代码,也感谢eryksun提供的代码片段——我在自己的代码中用了它。
我找到了自己的错误,真是个Python新手的失误。哎呀。我在模块中某个函数外面声明了一些变量,天真地以为在函数里修改它们的值。结果当然不行,所以我的glDrawPixels调用实际上是在画一些随机的内存内容。
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))
9
我觉得你已经很接近了。试试这个:
pBits = im.convert("RGBA").tostring("raw", "RGBA")
首先,图像需要转换成RGBA模式,这样RGBA原始模式的打包工具才能使用(可以查看Pack.c文件)。你可以检查一下len(pBits) == im.size[0]*im.size[1]*4
,对于你的gloves200图像来说,这个计算是200x200x4 = 160,000字节。