|
|
2014/2/24(Mon) 18:45:53|NO.60253
画像Aをgmode 4で透過状態にして、
その画像Aが表示されている範囲にだけ画像Bを重ねる
(画像Aが透過されている部分と同じ部分を画像Bでも透過する)と言うのは可能でしょうか?
|
|
2014/2/24(Mon) 19:39:04|NO.60256
今スマホしか持っていない状況で脳内でシミュレーション
しましたが、こんなのでどうでしょうか?
Aの背景色をC1と表記することにする。
画像AのコピーをA'とする(∵オリジナルに手を付けたくない)
A'をソースとして、A'と同形な真っ黒な長方形領域にgmode4にてC1透過で100%コピー。
このようにして作成した画像をI1とする。
I1をソースとして、A'に対してgmode6にて100%コピー。
A'は改変された。
これをソースとして、A'と同形な真っ白な長方形領域にgmode4にてC1透過で100%コピー。
このようにして作成した画像をI2とする。
これをソースとして、A'と同形な真っ白な長方形領域にgmode6にて100%コピー。
このようにして作成した画像をI3とする。
I3をアルファブレンド成分としてgmode7にてBを好みのターゲットへコピー。
これで上手く行くと良いんですが...。
|
|
2014/2/24(Mon) 19:43:26|NO.60257
ちょっと補足です。
↑気づいていると思いますが、のような回りくどいことをするのは、目的の処理を一撃でやる標準機能
が無いからです。
|
|
2014/2/24(Mon) 19:52:04|NO.60259
知識不足で理解できない感じです……
よろしければ、スクリプトの例示をお願いできないでしょうか?
|
|
2014/2/24(Mon) 19:55:12|NO.60260
すみません。
明後日まで無理です。
それまで未解決なら私が書き込みます。
|
|
2014/2/24(Mon) 20:42:29|NO.60264
【再掲3】
ふぅ…
一時間位悩んでやっと出来ました…
ちゃんと見ていませんがFunnyMakerさんの方法とは違うと思います
こちらのほうが無駄が多いです(´・ω・`)
あまりに長くなったのでモジュールにまとめました
わからない所があれば聞いて下さい
追記
何回も修正してすみません
焦りすぎですね…
screen 0:title "メインウィンドウ"
color 128,255,128
boxf
color
screen 1,200,200:title "画像A"
color 128,128,128//この色を透過させたい色とする(自由に変えられます)
boxf
color 0,0,255
circle 20,20,180,180
screen 2,200,200:title "画像B"
repeat 10
if cnt \ 2{
color 128,128,255
} else {
color 255,128,128
}
boxf cnt*20,-1,cnt*20+20
loop
gsel 0,1
kirinuki 1,2,128,128,128,3,4,5
/* 引数解説
kirinuki int picA, int picB, int cr, int cg, int cb,int kansei ,int s1,int s2
int picA 画像Aを読み込んであるバッファID
int picB 画像Aを読み込んであるバッファID
int cr 画像Aをgmode4で透過させるRGBのR
int cg 画像Aをgmode4で透過させるRGBのG
int cb 画像Aをgmode4で透過させるRGBのB
int kansei gmode7で使う完成したバッファID(予め確保する必要なし)
int s1 使用していない適当なバッファID(予め確保する必要なし)
int s2 使用していない適当なバッファID(予め確保する必要なし)
*/
//gmode4でただ透過した画像A
pos 50,50
mes "画像A ID:1"
color 128,128,128
gmode 4,200,200,255
gcopy 1,0,0,200,200
color
//kirinukiで作られたgmode7用のバッファからコピー
pos 250,50
mes "kansei ID:3"
gmode 7,200,200,255
gcopy 3,0,0,200,200
#module
#deffunc kirinuki int picA, int picB, int cr, int cg, int cb, int kansei,int s1,int s2
ng = ginfo_sel
gsel picA,0
picAw = ginfo(12)
picAh = ginfo(13)
buffer s1,picAw,picAh
buffer s2,picAw,picAh
buffer kansei,picAw*2,picAh
gsel s1
color
boxf
color cr,cg,cb
gmode 4,picAw,picAh,255
gcopy picA,0,0,picAw,picAh
gsel s2
color cr,cg,cb
gmode 4,picAw,picAh,255
gcopy picA,0,0,picAw,picAh
gmode 6,picAw,picAh,256
gcopy s1,0,0,picAw,picAh
gsel kansei
pos 0,0
gcopy picB,0,0,picAw,picAh
pos picAw,0
gmode 6,picAw,picAh,255
gcopy s2,0,0,picAw,picAh
gsel ng,0
return
#global
| |
|
2014/2/25(Tue) 11:10:43|NO.60271
>FunnyMakerさん
スクリプトを例示してくださった方がいらっしゃいましたので、一先ずそちらの方のやり方で試してみようと思います。
>kanahironさん
コレです!
ちょっと現在理解しきれていませんが、スクリプトを弄くって自分のプログラムに合わせる方法を模索してみます。
御両名とも、要領を得ない質問だったとは思いますが、適切な回答を頂き、まことにありがとうございました。
|
|
2014/2/25(Tue) 17:29:53|NO.60275
なんかモジュールにまとめちゃうと改変しづらい気がしたのでモジュールではない版も一応書いておきます
それに従い一行分追加しました
screen 0:title "メインウィンドウ"
color 128,255,128
boxf
color
screen 1,200,200:title "画像A"
color 128,128,128//この色を透過させたい色とする(自由に変えられます)
boxf
color 0,0,255
circle 20,20,180,180
screen 2,200,200:title "画像B"
repeat 10
if cnt \ 2{
color 128,128,255
} else {
color 255,128,128
}
boxf cnt*20,-1,cnt*20+20
loop
picA = 1 ;画像Aを読み込んであるバッファのID
picB = 2 ;画像Bの(ry
kansei = 3 ;gmode7用のバッファのID
s1 = 4 ;作業用バッファID
s2 = 5 ;作業用バッファID2
cr = 128
cg = 128
cb = 128
gsel 0
ng = ginfo_sel
gsel picA,0
picAw = ginfo(12);画像のサイズを取得
picAh = ginfo(13)
buffer s1,picAw,picAh
buffer s2,picAw,picAh
buffer kansei,picAw*2,picAh
//---------
gsel s1
color
boxf
color cr, cg, cb
gmode 4, picAw, picAh, 255
gcopy picA, 0, 0, picAw, picAh
gsel s2
color cr, cg, cb
gmode 4, picAw, picAh, 255
gcopy picA, 0, 0,picAw, picAh
gmode 6, picAw, picAh, 256
gcopy s1, 0, 0, picAw, picAh
gsel kansei
gmode 0, picAw, picAh, 255 ;これを忘れると二回目以降で同じバッファを使う場合おかしくなる
pos 0, 0
gcopy picB, 0, 0, picAw, picAh
pos picAw, 0
gmode 6, picAw, picAh, 255
gcopy s2, 0, 0, picAw, picAh
gsel ng, 0
//---------
//gmode4でただ透過した画像A
pos 50, 50
mes "画像A ID:1"
color 128, 128, 128
gmode 4, 200, 200, 255
gcopy 1, 0, 0, 200, 200
color
//gmode7用のバッファからコピー
pos 250, 50
mes "kansei ID:3"
gmode 7, 200, 200, 255
gcopy 3, 0, 0, 200, 200
ちなみにFunnyMakerさんの方法もやってみましたが、作業用バッファが3枚必要(自分のは2枚)
で、速度も1000回のループで自分のが450ms付近、FunnyMakerさんので650ms付近でした
なおバッファの初期化時間は含めていません。一回初期化すれば何度でも使いまわせます
| |
|
2014/2/26(Wed) 16:19:14|NO.60280
ようはマスク画像を作成するだけのことですよね。
それなら以下のようにすればいいと思います。
kansuninare //apiを使うため
#include "gdi32.as"
#define SRCCOPY $00CC0020
#define NOTSRCCOPY $00330008
#define ctype RGB(%1,%2,%3) ((%1)|(%2)<<8|(%3)<<16)
screen 0:title "メインウィンドウ"
color 128,255,128:boxf:color
screen 1,200,200:title "画像A"
color 128,128,128:boxf:color 0,0,255:circle 20,20,180,180
screen 2,200,200:title "画像B"
gradf 0,0,200,200,0,0xff,0xff0000
//マスク画像作成
gsel 1
hbitmap=CreateBitmap(200,200,1,1,0)
hmemdc=CreateCompatibleDC(hdc)
holdbitmap=Selectobject(hmemdc,hbitmap)
oldbk=SetBkColor(hdc,RGB(128,128,128)) //透過させる色
bitblt hmemdc,0,0,200,200,hdc,0,0,SRCCOPY
SetBkColor hdc,oldbk
screen 3,400,200:title "マスク画像"
gcopy 2,0,0,200,200
bitblt hdc,200,0,200,200,hmemdc,0,0,NOTSRCCOPY
redraw 1
gsel 0,1
gmode 7,0,0,256
gcopy 3,0,0,200,200
//このモジュールは関係ないので読み飛ばしてください
//WIN32APIを関数でも使えるようにするモジュール
#module
#deffunc kansuninare
#define STRUCTDAT_OT_STATEMENT 2
#define STRUCTDAT_OT_FUNCTION 4
#define STRUCTPRM_SUBID_DLL (-3)
#define STRUCTPRM_SUBID_DLLINIT (-4)
mref hspctx,68
dupptr hsphed,hspctx,96
if hsphed.15>0{
dupptr structdat,hspctx.210,hsphed.15
repeat hsphed.15/28
subid=structdat(7*cnt)>>16
if (subid==STRUCTPRM_SUBID_DLL | subid==STRUCTPRM_SUBID_DLLINIT) & (structdat(7*cnt+5)==STRUCTDAT_OT_STATEMENT){
structdat(7*cnt+5)|=STRUCTDAT_OT_FUNCTION
}
loop
}
return
#global
| |
|