Python PIL文本→glDrawPixels

时间:2013-12-13 01:20:16

标签: python opengl python-imaging-library

我正在尝试在PIL中绘制一些文本,将像素转换为我可以投入glDrawPixels并显示它的内容。我不确定我做错了什么;我不认为它是PIL部分,因为我已经做了一些测试,一切似乎都与PIL正常工作。我有点不知所措,因为代码没有显示任何内容,但也没有给我任何错误,所以我不知道在哪里工作。

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()

编辑:经过一番探索后,我找到了一个有效的解决方案:

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()

1 个答案:

答案 0 :(得分:0)

帮自己一个忙,不要使用glDrawPixels。它使用得很差,速度慢,使用起来很麻烦(正如你刚刚发现的那样)。 glDrawPixels的问题是,如果传递给glRasterPos的位置在转换后位于视口之外,则所有光栅操作都是禁用的,即glDrawPixels将不执行任何操作。

更好的解决方案是将图像加载到纹理中,绘制纹理四边形。 Apropos纹理。 glDrawPixels不是纹理操作,因此启用(固定功能)纹理目标对它没有影响。


我没有看到它的代码,但我认为你在代码的其他部分创建了一个带有OpenGL上下文的窗口(毕竟必须实现该类)。