首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyGI编辑图像颜色

PyGI编辑图像颜色
EN

Stack Overflow用户
提问于 2017-06-10 09:36:39
回答 1查看 91关注 0票数 0

能告诉我如何使用PyGI (或PyGTK)改变图像颜色吗?我需要方法或属性,比如CEGUI中的"ImageColour“,改变图像的非alpha通道。例如:我有一张照片,它只是白色的圆。我需要在不同的界面上使用这一轮,有不同的颜色。我不会在这一轮中创建另一个双模糊项,例如,我需要256种不同的颜色。和图片示例:

这是一张白色圆圆的照片,我有的是

这是圆圆的图片,我想看什么颜色?

下面是函数,我用它来改变颜色:

代码语言:javascript
复制
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只改变背景(而不改变白色)。

EN

回答 1

Stack Overflow用户

发布于 2017-06-12 19:01:07

在过去的几天里,我一直在玩这个游戏,把pixbuf看作是像素的直接表示并不是完全容易的。原因之一是GdkPixbuf软件确定了“行步长”,这会导致图像寻址中的“跳跃”。

在深入研究之前,我找到的最简单的解决方案是将像素转换为PIL.Image,在那里执行操作,然后将其转换为像素。以下是执行转换的两个函数:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44471795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档