我的最终目标是在图像中找到一种颜色(在这种情况下为白色)并将其替换为另一种颜色(基于某些情况)。因此,当某个变量发生变化时,白色会被特定的颜色所取代。
然而,到目前为止我正在玩图像(使用教程..etc)。我正在尝试使用以下代码来打印图像的调色板。我的理解是颜色是表示RGB的3整数的“元组”。 0 =最暗,255 =白色。所以,我正在测试的图像是黑白图像。我期待像“(0,0,0),(255,255,255)”这样的东西。所以,我想我是否可以做到这一点,然后我可以编写代码用适当的颜色替换“(255,255,255)”。
我提到了最终目标,因为我非常清楚我的方法可能不是最好的,也许有人有更好的方法可以解决这个问题。如果没有,我至少希望能够打印一个引用图像所包含颜色的字符串。 “NOFRAME”是我在这个网站上发现的一条很棒的建议,因为我实际上并没有“使用”图像/图形 - 只是使用它们的属性。
image1=r"C:\Python27\Lib\site-packages\pygame\examples\data\image1.jpg"
image2=r"C:\Python27\Lib\site-packages\pygame\examples\data\image2.png"
import pygame, sys
from pygame.locals import *
pygame.init()
pygame.display.set_mode((1,1), pygame.NOFRAME)
background = pygame.image.load(image1).convert()
mouse_c=pygame.image.load(image2).convert_alpha()
colorpal = pygame.Surface.get_palette(mouse_c)
print colorpal
答案 0 :(得分:3)
您想要做的是需要大量的像素级工作,所以我建议您使用pygame.PixelArray
对象来直接像素访问曲面。
对于您特别想要做的事情,听起来您可以使用pygame.PixelArray.replace()
方法。
答案 1 :(得分:2)
您可以使用Pygame曲面的get_at
方法获取图像曲面上的单个像素 - 与mouse_c.get_at((0,0))
中一样。
这是你要求的严格要求 - 但它不适合任何现实世界的需要,因为它是非常的,而且我说极其缓慢地处理图像的所有像素调用这个。
您可以使用get_buffer
获取图像缓冲区并将其解释为raw,或将缓冲区传递给使用本机代码编写的函数以获得一定的速度。
尽管如此,如果您的目标是实时替换另一种颜色,您可以使用索引图像 - 这样,每个图像都会有一个颜色表,您只需修改颜色编号{{1} }为10
,当您渲染图像时,该颜色的所有出现都变为蓝色。这很快 - 不像8位视频游戏那时由硬件完成那么高效 - 但是在纯Python代码中尝试进行任何替换都会快几个数量级。