1

我的最终目标是在图像中找到一种颜色(在本例中为白色)并将其替换为另一种颜色(基于某些情况)。因此,随着某个变量的变化,白色被替换为特定的颜色。

但是,要到达那里,我目前只是在玩图像(使用教程..等)。我正在尝试使用下面的代码来打印图像的调色板。我的理解是颜色是代表 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
4

2 回答 2

3

您想要做的是需要大量像素级的工作,因此我建议您使用pygame.PixelArray对象直接访问表面的像素。

对于您特别想做的事情,听起来您可以使用该pygame.PixelArray.replace()方法。

于 2013-06-01T18:28:00.487 回答
2

您可以使用get_atPygame 表面的方法获取图像表面上的单个像素 - 如mouse_c.get_at((0,0)).

严格来说,这正是您所要求的——但它不适合任何现实世界的需求,因为它非常,而且我说的是,处理图像的所有像素调用它的速度非常慢。

您可以使用图像缓冲区get_buffer并在那里解释原始数据,或者将缓冲区传递给用本机代码编写的函数以获得一些速度。

尽管如此,如果您的目标是实时用另一种颜色替换一种颜色,您可以使用索引图像 - 这样,每个图像都会有一个颜色表,您只需将颜色编号修改100,0,255,然后在渲染时图像中,该颜色的所有出现都变为蓝色。这很快——不像以前通过硬件完成的 8 位视频游戏时代那样高效——但是你尝试在纯 Python 代码中进行的任何替换都会快几个数量级。

于 2013-06-01T14:56:01.593 回答