fork download
  1. #coding:utf-8
  2. """
  3.  
  4. Author's Twitter: TonyMooori
  5.  
  6. 基本,自分のメモ用です.
  7.  
  8. Win10のmspaint.exe上で画像を描画するプログラムでうs
  9.  
  10. 同一ディレクトリにペイントのボタンの画像が無いと動かないので
  11. 試しにやってみようとか思ってもだいぶ頑張らないと動きません.ゴメンナサイ.
  12.  
  13. ただreduce_color関数だけは
  14. 画像の色をMiniBatchKMeansで減色してるので,そこだけは多少使えるかと思います
  15.  
  16. """
  17. import numpy as np
  18. import cv2
  19. import time
  20. import pyautogui as pa
  21.  
  22. def set_size(src):
  23. # 対角線の長さが200になるようなスケールを計算
  24. h,w,c = src.shape
  25. scale = 200.0 / np.sqrt( h**2 + w**2 )
  26. h = int(h*scale)
  27. w = int(w*scale)
  28.  
  29. # リサイズ
  30. return cv2.resize(src,(w,h))
  31.  
  32. def reduce_color(src):
  33. # k-meansでクラスタリング
  34. # -> 代表値に置き換えることで自然?な減色をする
  35. from sklearn.cluster import MiniBatchKMeans
  36. X = src.reshape(src.shape[0]*src.shape[1],3)
  37. clf = MiniBatchKMeans(16)
  38. y = clf.fit_predict(X)
  39. return clf.cluster_centers_[y].reshape(src.shape).astype(np.uint8)
  40.  
  41. def to_num(c):
  42. # uint8 x 3 の色データを int 型にする
  43. return c[:,:,0] * ( 2 ** 16 ) + c[:,:,1] * ( 2 ** 8 ) + c[:,:,2]
  44.  
  45. def to_col(c):
  46. # int型のデータを分割してr,g,bに分ける
  47. r = c % 256
  48. g = ( c//( 2 ** 8 ) ) % 256
  49. b = ( c//( 2 ** 16 ) ) % 256
  50. return np.array([r,g,b])
  51.  
  52. def img_click(path):
  53. # 指定の画像の場所をクリックする
  54. while True:
  55. pos = pa.locateCenterOnScreen(path)
  56. if pos != None:
  57. pa.click(pos)
  58. return
  59.  
  60. def change_color(color):
  61. # ペイントの各ボタンを順番にクリックする
  62. r = color[0]
  63. g = color[1]
  64. b = color[2]
  65.  
  66. # 真っ白とか描画する必要ない
  67. if r > 250 and g > 250 and b > 250:
  68. return True
  69.  
  70. # ボタンを順にクリックしてく
  71. img_click("color_edit.png")
  72. pos = None
  73. while pos == None:
  74. pos = pa.locateCenterOnScreen("red.png")
  75. pa.click( (pos[0]+30,pos[1]) )
  76. pa.hotkey('ctrl', 'a')
  77. pa.typewrite(str(r))
  78. pa.click( (pos[0]+30,pos[1]+27) )
  79. pa.hotkey('ctrl', 'a')
  80. pa.typewrite(str(g))
  81. pa.click( (pos[0]+30,pos[1]+60) )
  82. pa.hotkey('ctrl', 'a')
  83. pa.typewrite(str(b))
  84. img_click("ok.png")
  85.  
  86. return False
  87.  
  88. def draw_img(src):
  89. # 画像を描画する
  90.  
  91. # 色を抽出してピクセル数が大きい順にソート
  92. # 多分もっとスマートな書き方がある
  93. img = to_num(src)
  94. color_list = np.unique(img)
  95. color_num = np.zeros(len(color_list))
  96. for i in range(len(color_list)):
  97. col = color_list[i]
  98. color_num[i] = len(np.where( img == col )[0])
  99. arg_list = np.argsort(color_num)[::-1]
  100. color_list = color_list[arg_list]
  101.  
  102. # 高さ・幅を抽出
  103. h,w = img.shape
  104.  
  105. # 5秒待って
  106. time.sleep(5)
  107.  
  108. # 初期のマウスの座標を取得
  109. x0 = pa.position()[0]
  110. y0 = pa.position()[1]
  111.  
  112. # ピクセル間の距離
  113. side = 5
  114.  
  115. # Python夢の重ループ!!!!
  116. # 色を順番に描画してくよ!!
  117. for col in color_list:
  118.  
  119. # 色をセットする
  120. if change_color(to_col(col)):
  121. continue
  122.  
  123. # ドラッグ中ならTrueになるフラグ
  124. isDragging = False
  125.  
  126. for j in range(h):
  127. for i in range(w):
  128. # 現在の座標取得
  129. x = x0 + side * i
  130. y = y0 + side * j
  131.  
  132. if col == img[j,i]:
  133. # ドラッグスタート
  134. if isDragging == False:
  135. pa.moveTo(x,y)
  136. pa.mouseDown()
  137. isDragging = True
  138.  
  139. elif isDragging == True:
  140. # ドラッグ終了
  141. pa.moveTo(x,y)
  142. pa.mouseUp()
  143. isDragging = False
  144.  
  145. # 一行書いたらmouseUp
  146. pa.mouseUp()
  147.  
  148. if __name__=="__main__":
  149. pa.PAUSE = 0.000001
  150. src = cv2.imread("miku.jpg")
  151. src = set_size(src) # 大きさ調節
  152. src = reduce_color(src) # k-meansで減色
  153. draw_img(src) # 描画
  154.  
Runtime error #stdin #stdout #stderr 0.11s 25336KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "prog.py", line 17, in <module>
ImportError: No module named cv2