Изображение Python PIL.tostring()

Я новичок в Python и PIL. Я пытаюсь следовать образцам кода о том, как загрузить изображение в Python через PIL, а затем нарисовать его пиксели с помощью 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 пикселей. Однако это не предполагаемое изображение — похоже, что оно рисует пиксели из случайной памяти. Гипотеза случайной памяти подтверждается тем фактом, что я получаю один и тот же узор, даже когда пытаюсь нарисовать совершенно разные изображения. Кто-нибудь может мне помочь? Я использую Python 2.7 и версию 2.7 pyopenGL и PIL в Windows XP.

снимок экрана


person ahoffer    schedule 20.07.2011    source источник


Ответы (3)


Я думаю, вы были близки. Пытаться:

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

Сначала изображение должно быть преобразовано в режим RGBA, чтобы был доступен упаковщик необработанного режима RGBA (см. Pack.c в libimaging). Вы можете проверить это len(pBits) == im.size[0]*im.size[1]*4, что составляет 200x200x4 = 160 000 байт для вашего изображения перчатки200.

person Eryk Sun    schedule 20.07.2011
comment
Это замечательно. Спасибо. -Аарон - person ahoffer; 20.07.2011

Вы пытались использовать преобразование внутри функции 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))
person mikebabcock    schedule 20.07.2011
comment
Функция .tostring возвращает мне эту ошибку. - person ahoffer; 20.07.2011
comment
Добавлен обходной путь, найденный по адресу java2s.com/Open-Source/Python/GUI/Python-Image-Library/ на мой фрагмент выше - person mikebabcock; 20.07.2011
comment
Спасибо за обход. В чем проблема совместимости. Я запускал старый пример кода в более новой версии библиотеки? - person ahoffer; 20.07.2011

Спасибо вам за помощь. Спасибо mikebabcock за обновление примера кода в Интернете. Спасибо eryksun за фрагмент кода — я использовал его в своем коде.

Я нашел свою ошибку, и это была новая ошибка Python. Ой. Я объявил некоторые переменные вне области действия какой-либо функции в модуле и наивно думал, что изменяю их значения внутри функции. Конечно, это не работает, поэтому мой вызов glDrawPixels на самом деле отрисовывал случайную память.

person ahoffer    schedule 20.07.2011
comment
Я импортировал только класс Image из PIL. Теперь я не получаю ошибку при выполнении: pBits=im.convert('RGBA').tostring() Не могу понять почему. Какая там коллизия пространств имен? Является ли tostring() какой-то глобальной функцией или определена в верхней части иерархии классов? - person ahoffer; 21.07.2011