2017-06-10 110 views
0

任何可以告訴我如何使用PyGI(或PyGTK)更改圖像顏色? 我需要方法或屬性,如CEGUI中的「ImageColour」,改變非alpha通道的圖像。例如: 我有一張照片,它只是白色的圓形。我需要在界面的不同位置使用這一輪,使用不同的顏色。例如,我不會創建本輪的另一個dublicates,例如,我需要256種不同的顏色。 和圖片示例:PyGI編輯圖像顏色

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什麼改變只背景(並且不改變白色)

回答

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考慮到rowstride自動,節省了連續字節data以正確的方式在存儲器中。

PILPillow for Python3)中,您可以對圖像執行許多操作,包括逐像素訪問。請注意,pixbuf總是使用RGB(A)組件,因此您必須小心轉換和操作!

在任何情況下,後一個函數都會顯示如何直接構建圖像,如何將內存(bytes)數組轉換爲GdkPixbuf