主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PyGTKでの透過ウィンドウ

                
tags:
http://d.hatena.ne.jp/jkani4/20080121/1200928127
PyGTKの透過ウィンドウを試したくて、↑の記事を真似してみた。

logo.png
画像ビューアで開いているのが使った画像、下は実際にスクリプトを走らせて透過ウィンドウとしたもの。
透過領域が納得できん。透過しているんだけど、半端な輝度値が閾値になっているような・・・
というわけでスクリプト書き換え。とりあえずマスクはされているから、半端になっている閾値の問題を解決すればよい。
では輝度値が(0,0,0)のところだけ透過のマスクにしようと決める。
ならばcairoでマスクを作っている部分をいじくる。
・マスクの輝度値を0 or 255に二値化すればいい
pycairoで参考にしたのは↓
http://kyle-in-jp.blogspot.com/2009/04/pycairoo.html

mkmaskという関数を作って、on_size_allocateのなかをちょっと書き換えた。
logo2.png

***************************************************

#-*- coding: utf-8 -*-

import math

import cairo
import gtk
from gtk import gdk

def mkmask(filename):
img = cairo.ImageSurface.create_from_png(filename)
ctx = cairo.Context(img)
ctx.set_source_surface(img, 0, 0)
ctx.paint()
ia = img.get_data()
for ip in range(0, img.get_stride() * img.get_height(), 4):
ia[ip+0] = ia[ip+1] = ia[ip+2] = \
chr(((ord(ia[ip+0]) + ord(ia[ip+1]) + ord(ia[ip+2]))/3 > 0) * 255)
return img

class ShapedWindow(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)

self.set_position(gtk.WIN_POS_CENTER)
self.set_decorated(False)
self.connect('size-allocate', self.on_size_allocate)
self.connect('delete-event', self.on_delete_event)

img = gtk.Image()
img.set_from_file('logo.png')
self.add(img)
self.set_resizable(False)

def on_size_allocate(self, win, allocation):
# オフスクリーンのPixmapを作成する。
# マスクに使いたいだけなので、色深度は1(白黒)に。
bitmap = gtk.gdk.Pixmap(None, allocation.width, allocation.height,1)
ca = bitmap.cairo_create()
ca.set_source_surface(mkmask('logo.png')) #imgをcaに重ねる
ca.set_operator(cairo.OPERATOR_OVER)
ca.paint()

# ↑で作成したマスク用ピクセルマップを使ってWindowをマスク。
win.shape_combine_mask(bitmap, allocation.x, allocation.y)
return True

def on_delete_event(self, widget, event=None):
print '-- quit --'
gtk.main_quit()
#
#
if __name__ == '__main__':
win = ShapedWindow()
win.show_all()

gtk.main()

            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。