能告诉我如何使用PyGI (或PyGTK)改变图像颜色吗?我需要方法或属性,比如CEGUI中的"ImageColour“,改变图像的非alpha通道。例如:我有一张照片,它只是白色的圆。我需要在不同的界面上使用这一轮,有不同的颜色。我不会在这一轮中创建另一个双模糊项,例如,我需要256种不同的颜色。和图片示例:
下面是函数,我用它来改变颜色:
image = gtk.Image()
image.set_from_file("images/button.png")
pix_buffer = image.get_pixbuf()
pix_buffer.fill(0xA32432FF)
image.set_from_pixbuf(pix_buffer)那是不正确的。这是填充完整的图像到四色红色。
另一个想法是modify/modify_base,但是这里只使用modify_bg只改变背景(而不改变白色)。
发布于 2017-06-12 19:01:07
在过去的几天里,我一直在玩这个游戏,把pixbuf看作是像素的直接表示并不是完全容易的。原因之一是GdkPixbuf软件确定了“行步长”,这会导致图像寻址中的“跳跃”。
在深入研究之前,我找到的最简单的解决方案是将像素转换为PIL.Image,在那里执行操作,然后将其转换为像素。以下是执行转换的两个函数:
def pixbuf2image(self, pxb):
""" Convert GdkPixbuf.Pixbuf to PIL image """
data = pxb.get_pixels()
w = pxb.get_width()
h = pxb.get_height()
stride = pxb.get_rowstride()
mode = "RGB"
if pxb.get_has_alpha():
mode = "RGBA"
img = Image.frombytes(mode, (w, h), data, "raw", mode, stride)
return img
def image2pixbuf(self, img):
""" Convert PIL or Pillow image to GdkPixbuf.Pixbuf """
data = img.tobytes()
w, h = img.size
data = GLib.Bytes.new(data)
pxb = GdkPixbuf.Pixbuf.new_from_bytes(data, GdkPixbuf.Colorspace.RGB,
False, 8, w, h, w * 3)
return pxb幸运的是,new_from_bytes会自动考虑行步长,并以正确的方式在内存中保存data中的连续字节。
在PIL (Pillow for Python3)中,您可以对图像执行许多操作,包括逐像素访问.请注意,pixbuf总是使用RGB(A)组件,所以您必须小心转换和操作!
在任何情况下,如果要直接构造映像,后一个函数将显示如何将内存(bytes)数组转换为GdkPixbuf。
https://stackoverflow.com/questions/44471795
复制相似问题