Python PIL Image.tostring () - PullRequest
       11

Python PIL Image.tostring ()

4 голосов
/ 20 июля 2011

Я новичок в 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.

screen shot

Ответы [ 3 ]

8 голосов
/ 20 июля 2011

Я думаю, что вы были близки.Попробуйте:

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

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

1 голос
/ 20 июля 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))
0 голосов
/ 20 июля 2011

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

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

...