2017-06-10 8 views
0

Kann mir jemand sagen, wie man die Bildfarbe mit PyGI (oder PyGTK) ändert? Ich brauche eine Methode oder Eigenschaft, wie "ImageColour" in CEGUI, was die Nicht-Alpha-Kanäle des Bildes ändert. Zum Beispiel: Ich habe ein Bild, es ist nur weiße Runde. Ich muss diese Runde an verschiedenen Stellen der Schnittstelle mit verschiedenen Farben verwenden. Und ich werde keine weiteren Dubletten dieser Runde erstellen, zum Beispiel brauche ich 256 verschiedene Farben. und Bilder Beispiel:PyGI Bildfarbe bearbeiten

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

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

Hier Funktionen, was ich mit Farbe ändern:

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) 

Das ist nicht korrekt funktionieren. Das füllt das volle Bild bis zum roten Quad.

Eine weitere Idee ist modify_fg/modify_base, aber hier funktioniert nur modify_bg was nur Hintergrund zu ändern (und ändert sich nicht weiße Farbe)

Antwort

0

Ich habe für die letzten Tage mit diesem gespielt und es ist nicht ganz einfach, pixbuf als unmittelbare Darstellung der Pixel zu behandeln. Einer der Gründe ist, dass die GdkPixbuf Software eine 'rowstride' bestimmt, die 'Sprünge' in der Adressierung des Bildes verursacht.

Bis ich mehr untersuchen kann, ist die einfachste Lösung, die ich gefunden habe, den Pixbuf in PIL.Image umzuwandeln, die Operationen dort durchzuführen und zurück zu Pixbuf zu konvertieren. Dies sind die zwei Funktion, die die Konvertierung zu tun:

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 

Zum Glück new_from_bytes berücksichtigt die rowstride automatisch und speichert das kontinuierliche Bytes in data in der richtigen Art und Weise im Speicher.

In PIL (Pillow für Python3) können Sie viele Operationen auf dem Bild, einschließlich Pixel-für-Pixel-Zugriff. Beachten Sie, dass pixbuf immer RGB(A) Komponenten verwendet, also müssen Sie vorsichtig mit den Konvertierungen und Operationen sein!

In jedem Fall zeigt die letztere Funktion, wie ein Speicher (bytes) Array zu einem GdkPixbuf konvertieren, wenn Sie das Bild direkt erstellen möchten.

Verwandte Themen