2013-12-13 2 views
-1

Я пытаюсь нарисовать текст в PIL, конвертировать пиксели в что-то, что я могу бросить в glDrawPixels и отобразить его. Я не уверен, что я делаю неправильно; Я не думаю, что это часть PIL, так как я провел немного тестирования, и все, кажется, работает правильно с PIL. Я немного теряю, поскольку код ничего не отображает, но не вызывает у меня никаких ошибок, поэтому я не знаю, с чего работать.Python PIL text → glDrawPixels

import PIL 
from PIL import ImageFont 
from PIL import Image 
from PIL import ImageDraw 
from OpenGL.GL import * 

class tooltipText(object): 

def __init__(self, x, y, text, font, fontsize, colour): 
    self._x = x 
    self._y = y 
    self._text = text 
    self._font = font 
    self._fontsize = fontsize 
    self._colour = colour 
    self._pBits = None 

def makeText(self): 
    font = ImageFont.truetype(self._font,self._fontsize) 
    img=Image.new("RGBA", (300,200),(self._colour[0],self._colour[1],self._colour[2],0)) 

    draw = ImageDraw.Draw(img) 
    draw.text((0, 200-self._fontsize),self._text,self._colour,font=font) 
    img_flip = img.transpose(Image.FLIP_TOP_BOTTOM) 

    pBits = img_flip.tobytes("raw", "RGBA") 
    self._pBits = pBits 
    return self._pBits 

def displayText(self): 
    glEnable(GL_TEXTURE_2D) 
    glPushMatrix() 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 
    glTranslate(0, 0,0) 
    glRasterPos(self._x,self._y) 
    glDrawPixels(300, 200, GL_RGBA, GL_UNSIGNED_BYTE, self._pBits) 
    glEnd() 
    glDisable(GL_TEXTURE_2D) 
    glPopMatrix() 

Edit: После ковыряться немного я нашел решение, которое работает:

def displayText(self): 
    vPort = glGetIntegerv(GL_VIEWPORT) 
    glPushMatrix() 
    glLoadIdentity() 
    glTranslate(self._x, self._y,0) 
    glRasterPos(0,0,0) 
    glOrtho(0, vPort[2], 0, vPort[3], -1, 1) 
    glMatrixMode(GL_MODELVIEW) 
    glDrawPixels(300, 200, GL_RGBA, GL_UNSIGNED_BYTE, self._pBits) 
    glEnd() 
    glDisable(GL_TEXTURE_2D) 
    glPopMatrix() 

ответ

0

Сделайте себе одолжение и не используют glDrawPixels. Он плохо поддерживается, медленный и громоздкий в использовании (как вы только что узнали). Проблема с glDrawPixels заключается в том, что если позиция, переданная в glRasterPos, находится за пределами окна просмотра после преобразования, все растровые операции отключены, то есть glDrawPixels ничего не сделает.

Лучшее решение - загрузить изображение в текстуру, нарисовать текстурированный квадрат. По поводу текстур. glDrawPixels - это не текстурирование, поэтому вы можете активировать (фиксированную функцию) цель текстуры.


Я не вижу код для него, но я полагаю, вы создать окно с контекстом OpenGL в какой-либо другой части коды (надо что-то класса создания экземпляра в конце концов).