なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

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

pythonからVRAMに書き込む

rectangles.jpg


ウインドウのないWindowsプログラムを作りたかった。もちろんPythonで。
考えてでた案がVRAMに直接書き込めば絵とかwindowなしで書き込めるんじゃね?というもの。
で、いろいろ調べてみるとwindowsのapiでそれが実現できそうだ。

ひたすら調べていくと、CreateDCとかのキーワードがでてきたので、そのキーワードとかで調べてくいと、C言語で実際にウィンドウの外に長方形を書き込んでいるサンプルコードを発見。winapiを使っているということはpythonのctypesでこれを利用できるはずなので、pythonでバインド?してみた。ctypesについてあまりよく理解していないので、ポインタとかをどうやって処理してよいかわからず不安だったが、案外うまくいった。

それで、ある程度まとまったのでソースのメモ。



これが今回の主成果物である writeVRAM.py
色の指定方法が0xBGR(R = 00 から ffまで、B、Gも同様)みたいな感じで指定するのでsetColorにその変換作業が入っている。setColorに0-255以外の値を入れたときの動作は知らん。


import ctypes
dll = ctypes.windll.gdi32
hdc = dll.CreateDCA("DISPLAY",0,0,0)

def setColor(r=255,g=255,b=255):
# 0 <= Color <= 255

#convert to hex
B = hex(b) ; G = hex(g) ; R = hex(r)
#del "0x" string
B = B[B.index("x")+1:]
G = G[G.index("x")+1:]
R = R[R.index("x")+1:]

if B == "0" : B = "00"
if G == "0" : G = "00"
if R == "0" : R = "00"

num = "0x"+B+G+R

dll.SelectObject(hdc,dll.CreateSolidBrush(int(num,16)))

def drawPie(x1,y1,x2,y2,x3,y3,x4,y4):
"""
Pie
"""
dll.Pie(hdc,x1,y1,x2,y2,x3,y3,x4,y4)
def drawRRect(x1,y1,x2,y2,x3,y3):
"""
RoundRect
"""
dll.RoundRect(hdc,x1,y1,x2,y2,x3,y3)
def drawRect(x1,y1,x2,y2):
"""
Rectangle
"""
dll.Rectangle(hdc,x1,y1,x2,y2)


if __name__ == "__main__":
dll.SelectObject(hdc,dll.CreateSolidBrush(0x0000ff))
dll.Rectangle(hdc,100,100,200,200)


これは以前も掲載した気がするが一応掲載したwindowsPCのディスプレイサイズを調べる monitor.py

import ctypes
def getMonitorSize():
x = ctypes.windll.user32.GetSystemMetrics(0)
y = ctypes.windll.user32.GetSystemMetrics(1)
return x,y
def test():
x,y = getMonitorSize()
print x
print y

if __name__ == "__main__":
test()


でこれが、サンプルプログラム。上の2つのコードと一緒のディレクトリにいれてから実行すればあなたのデスクトップが四角だらけになる。コメントアウトをはずせば扇形だらけになる。

from writeVRAM import *
import monitor
import random
import time

mx,my = monitor.getMonitorSize()


while True:
x1 = random.randint(0,mx)
x2 = random.randint(0,mx)
x3 = random.randint(0,mx)
x4 = random.randint(0,mx)
y1 = random.randint(0,my)
y2 = random.randint(0,my)
y3 = random.randint(0,my)
y4 = random.randint(0,my)

setColor(random.randint(0,255),random.randint(0,255),random.randint(0,255))
#drawPie(x1,y1,x2,y2,x3,y3,x4,y4)
drawRect(x1,y1,x2,y2)
time.sleep(1)





今後は余裕があればwriteVRAMを改良して、ビットマップファイルから書き込めたり、高速化、1ピクセルにたいして書き込むメソッドなどを加えたい。
スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/125-487ef682

この記事へのトラックバック

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

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