Python PIL Image.tostring()使用方法

4 投票
3 回答
18595 浏览
提问于 2025-04-16 21:53

我刚开始学习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字节。

撰写回答