PyGI编辑图像颜色

时间:2017-06-10 09:36:40

标签: python user-interface colors pygtk

可以告诉我如何使用PyGI(或PyGTK)更改图像颜色吗? 我需要方法或属性,比如CEGUI中的“ImageColour”,改变图像的非alpha通道。例如: 我有一张照片,它只是白色的圆形。我需要在不同颜色的界面的不同位置使用这一轮。而且我不打算创建这一轮的另一个共同体,例如,我需要256种不同的颜色。 和图片示例:

This is picture with white round, what I've got

This is picture with round, what color I want to see

这是函数,我用来改变颜色:

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_fg / modify_base ,但这里仅适用于 modify_bg 只改变背景的内容(并且不会改变白色)< / p>

1 个答案:

答案 0 :(得分:0)

我在最后几天一直在玩这个,并且将pixbuf视为像素的直接表示并不是一件容易的事。其中一个原因是GdkPixbuf软件确定了'rowstride',导致图像寻址中的“跳跃”。

直到我可以调查更多,我发现最简单的解决方案是将pixbuf转换为PIL.Image,在那里进行操作,然后转换回pixbuf。这些是进行转换的两个函数:

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(Python3的Pillow)中,您可以对图像执行许多操作,包括逐像素访问。请注意pixbuf始终使用RGB(A)个组件,因此您必须小心转换和操作!

在任何情况下,如果您想直接构建图像,后一个函数会显示如何将内存(bytes)数组转换为GdkPixbuf