HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0224
gam画像Aをgmodeで透過させて、画像Aの表示範囲にだけ画像Bを重ねたい8解決


gam

リンク

2014/2/24(Mon) 18:45:53|NO.60253

画像Aをgmode 4で透過状態にして、
その画像Aが表示されている範囲にだけ画像Bを重ねる
(画像Aが透過されている部分と同じ部分を画像Bでも透過する)と言うのは可能でしょうか?



この記事に返信する


FunnyMaker

リンク

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を好みのターゲットへコピー。

これで上手く行くと良いんですが...。



FunnyMaker

リンク

2014/2/24(Mon) 19:43:26|NO.60257

ちょっと補足です。
↑気づいていると思いますが、のような回りくどいことをするのは、目的の処理を一撃でやる標準機能
が無いからです。



gam

リンク

2014/2/24(Mon) 19:52:04|NO.60259

知識不足で理解できない感じです……
よろしければ、スクリプトの例示をお願いできないでしょうか?



FunnyMaker

リンク

2014/2/24(Mon) 19:55:12|NO.60260

すみません。
明後日まで無理です。
それまで未解決なら私が書き込みます。



kanahiron

リンク

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



gam

リンク

2014/2/25(Tue) 11:10:43|NO.60271

>FunnyMakerさん
スクリプトを例示してくださった方がいらっしゃいましたので、一先ずそちらの方のやり方で試してみようと思います。

>kanahironさん
コレです!
ちょっと現在理解しきれていませんが、スクリプトを弄くって自分のプログラムに合わせる方法を模索してみます。


御両名とも、要領を得ない質問だったとは思いますが、適切な回答を頂き、まことにありがとうございました。



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付近でした
なおバッファの初期化時間は含めていません。一回初期化すれば何度でも使いまわせます



dekon

リンク

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



ONION software Copyright 1997-2021(c) All rights reserved.