2017-06-10 1 views
0

PyGI(またはPyGTK)を使用して画像の色を変更する方法は教えてください。 CEGUIの "ImageColour"のようなメソッドやプロパティが必要です。画像の非アルファチャンネルを変更するにはどうすればいいですか?例: 私は1つの画像、そのちょうど白いラウンドを持っています。私は異なる色で、このラウンドをインターフェイスの別の場所で使用する必要があります。そして、私はこのラウンドの別の公益団体、bcsを作成しません、例えば、私は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を扱うことは完全に容易ではない。理由の1つは、GdkPixbufソフトウェアがイメージのアドレッシングで「ジャンプ」を引き起こす「行間」を決定するということです。

もっと調べるまで、私が見つけた最も簡単な解決策は、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で連続バイトをrowstride自動的に考慮に入れて、保存します。これらは、変換を行う2つの関数です。

PILPillow for Python3)では、ピクセル単位のアクセスを含め、イメージ上で多くの操作を実行できます。 pixbufは常にRGB(A)のコンポーネントを使用しているため、コンバージョンと操作には注意する必要があります。

いずれの場合でも、イメージを直接構築する場合は、後者の関数はメモリ(bytes)配列をGdkPixbufに変換する方法を示します。

関連する問題