4

PyOpenGL を使用して 2D 画像を描画します。次に、Python Imaging Library (PIL) を使用して、このイメージをディスクに保存します。GLUT を使用して、完全に機能する画像を表示します。しかし、PIL を使用して画像を保存すると、間違ったクリッピングが抽出されます。サイズが間違っています。

これは、効果を再現する最小限の例です。コードを実行せずに出力をより明確にするために、出力も添付します。

from OpenGL.GL import *
from OpenGL.GLUT import *
from PIL import Image

width, height = 640, 480

def DrawStuff():
    poly1 = [(0,0), (640,0), (0,480)]
    color = (0.5, 0.4, 0.3, 0.8)
    glClear(GL_COLOR_BUFFER_BIT)
    glPushMatrix()
    glLineWidth(5.0)

    glColor4f(*color)
    glBegin(GL_POLYGON)
    glVertex2f(poly1[0][0], poly1[0][1])
    glVertex2f(poly1[1][0], poly1[1][1])
    glVertex2f(poly1[2][0], poly1[2][1])    
    glVertex2f(poly1[0][0], poly1[0][1])
    glEnd() # GL_POLYGON

    glPopMatrix()
    glPixelStorei(GL_PACK_ALIGNMENT, 1)
    data = glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE)
    image = Image.fromstring("RGBA", (width, height), data)
    image.show()
    image.save('out.png', 'PNG')
    glutSwapBuffers()


# glut initialization
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)
glutCreateWindow("Draw Polygons")
glutInitWindowSize(width, height)

# set the function to draw
glutDisplayFunc(DrawStuff)

# enable the alpha blending
glEnable(GL_BLEND)
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

# prepare for 2D drawing
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, width, height, 0, 0, 1)
glDisable(GL_DEPTH_TEST)
glMatrixMode(GL_MODELVIEW)

# start the mainloop
glutMainLoop ()

これは、GLUTウィンドウでどのように見えるか、どのように見えるべきかです これは、GLUTウィンドウでどのように見えるか、どのように見えるべきかです

これが、保存された画像がどのように見えるかです これが、保存された画像がどのように見えるかです

4

2 に答える 2

1

私は自分の問題を解決することができました。

最初に、関連する問題を抱えている人にも役立つ可能性のある次の解決策を試しました

しかしその後、広範な試行錯誤を経て、解決策ははるかに簡単であることがわかりました。

次の2行を交換するだけでした。

glutCreateWindow("Draw Polygons")
glutInitWindowSize(width, height)

glutInitWindowSize(width, height)
glutCreateWindow("Draw Polygons")

どうやらサイズはウィンドウの前に設定する必要があります

于 2011-08-19T10:23:56.243 に答える
0

OpenGLでは、座標系はPILとは異なる場所から始まることを考慮する必要があります。これを見てください。

于 2011-08-18T13:19:48.947 に答える