Python 使用pygame/pyglet从阵列重建图像时颜色不正确

Python 使用pygame/pyglet从阵列重建图像时颜色不正确,python,pygame,pyglet,Python,Pygame,Pyglet,我编写了这个程序,它将使用numpy和图像(PIL)库将图像读取为一组矩阵,并使用pyglet(和opengl)重建图像 使用pyglet的代码如下所示: import Image import numpy import window import sys import pyglet import random a=numpy.asarray(Image.open(sys.argv[1])) h,w= a.shape[0],a.shape[1] s=a[0] print s.shape ###

我编写了这个程序,它将使用numpy和图像(PIL)库将图像读取为一组矩阵,并使用pyglet(和opengl)重建图像

使用pyglet的代码如下所示:

import Image
import numpy
import window
import sys
import pyglet
import random
a=numpy.asarray(Image.open(sys.argv[1]))
h,w= a.shape[0],a.shape[1]
s=a[0]
print s.shape

#######################################
def display():
    x_a=0;y_a=h
    for page in a:
        for array in page: 
            j=array[2]
            k=array[1]
            l=array[0]
            pyglet.gl.glColor3f(l,j,k)
            pyglet.gl.glVertex2i(x_a,y_a)
            x_a+=1
        y_a-=1  
        x_a=0
######################################33
def on_draw(self):
    global w,h

    self.clear
    pyglet.gl.glClear(pyglet.gl.GL_COLOR_BUFFER_BIT)
    pyglet.gl.glBegin(pyglet.gl.GL_POINTS)
    display()
    pyglet.gl.glEnd()
    pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')
window.win.on_draw=on_draw

#######################################

u=window.win(w,h)
pyglet.app.run()
修改相同的代码以使用pygame库(并且没有任何opengl使用)

pyglet vs.pygame的结果:


所以我的问题是…为什么会有问题?我使用opengl逐像素绘制图片的方式有问题吗?或者目前我无法理解的其他问题吗?

Pygame.Color
要求整数在0-255范围内,而
pyglet.gl.glColor3f
要求浮动在0.0-1.0范围内。这样的转换应该可以解决您的问题:

j=array[0] / 255.0
k=array[1] / 255.0
l=array[2] / 255.0
pyglet.gl.glColor3f(j,k,l)

Pygame.Color
要求整数在0-255范围内,而
pyglet.gl.glColor3f
要求浮点在0.0-1.0范围内。这样的转换应该可以解决您的问题:

j=array[0] / 255.0
k=array[1] / 255.0
l=array[2] / 255.0
pyglet.gl.glColor3f(j,k,l)

你不能解释什么不起作用。你希望它在pyglet中使用图像作为正常纹理吗?嗯,图像的一个非常破旧的形式出现了,而不是完美的形式。我本来会发布原始图片和上面代码的输出。但由于我是一个没有排名或声誉的新手,我不能这样做。你可以在imgur上发布图像,并链接它。你在使用pygame、PIL和pyglet吗?我没有看到导入,但您被标记为pygame,因此我感到困惑。-我确实在找你,但找不到具体的职位。有一种方法可以将pygame表面加载为opengl(pyglet)纹理。我很抱歉,希望通过编辑可以让事情变得更加明确。用一张RGBW值的超小图片试试怎么样?4px图片,这样您将看到全局所有颜色值是否都是错误的。您无法解释什么不起作用。你希望它在pyglet中使用图像作为正常纹理吗?嗯,图像的一个非常破旧的形式出现了,而不是完美的形式。我本来会发布原始图片和上面代码的输出。但由于我是一个没有排名或声誉的新手,我不能这样做。你可以在imgur上发布图像,并链接它。你在使用pygame、PIL和pyglet吗?我没有看到导入,但您被标记为pygame,因此我感到困惑。-我确实在找你,但找不到具体的职位。有一种方法可以将pygame表面加载为opengl(pyglet)纹理。我很抱歉,希望通过编辑可以让事情变得更加明确。用一张RGBW值的超小图片试试怎么样?4px图片,这样您将看到全局所有颜色值是否错误。