我正在尝试在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()
答案 0 :(得分:0)
帮自己一个忙,不要使用glDrawPixels。它使用得很差,速度慢,使用起来很麻烦(正如你刚刚发现的那样)。 glDrawPixels的问题是,如果传递给glRasterPos
的位置在转换后位于视口之外,则所有光栅操作都是禁用的,即glDrawPixels将不执行任何操作。
更好的解决方案是将图像加载到纹理中,绘制纹理四边形。 Apropos纹理。 glDrawPixels不是纹理操作,因此启用(固定功能)纹理目标对它没有影响。
我没有看到它的代码,但我认为你在代码的其他部分创建了一个带有OpenGL上下文的窗口(毕竟必须实现该类)。