前回でマウスカーソル画像を取得できたので、ウィンドウのキャプチャ画像に重ねてみた


普通の矢印カーソル


アルファブレンド
画像を重ねたとき、完全透明色のところは下の画像の色をそのまま残せば良くて、不透明色のところはカーソルの色に置き換えればいい、それはわかるけどその他の半透明色のところは計算方法が思いつかなくて
半透明画像合成 計算
とかでググって
■CharatSoft.com
www.charatsoft.com
こちらの左下のおとゲマZから
■音ゲーをつくろ~ ♪(^^)♪
http://www.charatsoft.com/develop/otogema/
ここの5-5.効果に
確定色 = 背景色 + (重ねる色 - 背景色) * (アルファ値 / 255)
この計算式を使ったら期待通りの色になった。アルファブレンドって聞いたことはあったけど、半透明合成ってことだったのねえ
変数に入っている画像の閲覧と保存
gogowaten.hatenablog.com
このときに作ったBitmapSourceVisualizerがようやく日の目を見た


マウスカーソル画像の半透明具合

半透明具合を見るためにエクセルのシート画像に重ねてみると

アルファ値

黒(0, 0, 0)の半透明かと思ってたけど、(0, 4, 23)だから色相で言ったら青だねえ
計算してみる

確定色 = 背景色 + (重ねる色 - 背景色) * (アルファ値 / 255)
さっきのこれを使って
R = 255 + (0 - 255) * (55 / 255) = 200
G = 0 + (4 - 0) * (55 / 255) = 0.8627451
B = 128 + (23 - 128) * (55 / 255) = 105.35294
小数点以下を四捨五入で
RGB(200, 1, 105)になった
実際に重ねてみる

拡大して確認

マスク画像を使うマウスカーソルの場合

C#-マウスカーソル画像のキャプチャ-スタックオーバーフロー
https://stackoverflow.com/questions/918990/c-sharp-capturing-the-mouse-cursor-image
ICONINFO (winuser.h) - Win32 apps | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/ns-winuser-iconinfo
この辺をGoogle翻訳してみると、そんなかんじで、使い方は上半分とANDしたあとに、下半分をXOR…なんのことかよくわからん、けど.NETにはビット演算してくれる演算子があるから、それを使ってみたらできた
ANDは&
XORは^
変数 = 背景色 & 重ねる色
確定色 = 変数 ^ 重ねる色


RGBそれぞれを足してみると
167+88=255
70+185=255
255+0=255
全部255になるからビット演算を使わなくても、計算は(255-元の色)とかでもできそうねえ
ビット演算
167のRで見てみる
ANDするマスク画像の色は全部白で値は255
XORするマスク画像はカーソル部分だけが白(255)、それ以外は黒(0)
167 AND 255 = 167 これは
1010_0111 = 167
AND
1111_1111 = 255
は
1010_0111 = 167
つまり全く色変化しない
続けてXORでのカーソル部分だった場合、重ねる色は白(255)
167 XOR 255 = 88 これは
1010_0111 = 167
XOR
1111_1111 = 255
は
0101_1000 = 88
ってなるみたい、へー
もしカーソル部分じゃない部分の色、黒(0)を重ねると
167 XOR 0 = 167 これは
1010_0111 = 167
XOR
0000_0000 = 0
は
1010_0111 = 167
色変化しない





2020WPF/20201119_マウスカーソル描画
テストアプリダウンロード
https://github.com/gogowaten/2020WPF/releases/download/1.1/20201119_.7z

のはずなんだけど、これが効かないアプリがあって、タスクマネージャーとデスクトップ検索のEverythingで、これが訊いてくれない
関連記事
前回は3日前