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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0906
匿名上手く透過されない7解決


匿名

リンク

2009/9/6(Sun) 13:14:34|NO.27550

buffer 2 : picload filename
aa = ginfo(12) : bb = ginfo(13)
x = (xsize - aa) / 2 : y = (ysize - bb) / 2
pget 0,0 : gmode 4,,,256
buffer 3,xsize,ysize : color r,g,b : boxf
pos x,y : gcopy 2,0,0,aa,bb
cc = instr(filename,0,".") : dd = strmid(filename,0,cc)
bmpsave dd + "_n.bmp"

上記の様な感じで、画像を任意の大きさ・色の中央に再配置して保存するというものです。
その際、読み込んだ画像の左上と同じ色を透過したいのですが、上手く重なりません。
中央には配置されますが、透過されないまま保存されてしまいます。
自分でも色々試行錯誤重ねているのですが、どなたか原因を教えて頂けませんか?



この記事に返信する


Ve

リンク

2009/9/6(Sun) 14:24:53|NO.27552

ginfo_r,ginfo_g,ginfo_bでは?



Kpan

リンク

2009/9/6(Sun) 15:46:29|NO.27556

ぜんぜん質問と関係ないですが、
ファイルパス文字列の分解ならgetpath関数を。



匿名

リンク

2009/9/6(Sun) 15:46:43|NO.27557

Ve様
せっかくご解答していただいたのに申し訳ないのですが、
一行だけではさすがに意味が分かりかねました。

5行目のcolor r,g,bの事をおっしゃているのかなとも思いましたが、
このRGBはinput命令で受け取った変数ですので問題ないかなと思いました。
何より、読み込んだ画像の左上の色に背景色を合わせるのではなく、
読み込んだ画像"を"合わせるので此方の希望した挙動と違うものになるかなぁと。

何処か別の事をおっしゃっているのかもしれませんが、此方の読解力が足らず申し訳ないです。



匿名

リンク

2009/9/6(Sun) 15:58:50|NO.27558

Kpan様
getpath命令ですか。
今調べてきたところなのですが、確かに此方の命令を使用したほうがスマートになりそうですね。

情報のご提供ありがとうございます。
また、動かせるようにgetpath命令を使用して修正したものを、
長くなってしまうのですが、全て乗せておきます。
どのような状態になるのか、稚拙な文章よりも動かした方が分かりやすいと思いましたので。

#packopt name "画像中央配置"
#packopt hide 1 #uselib "shell32.dll" #func DragAcceptFiles "DragAcceptFiles" int,int #func DragQueryFile "DragQueryFileA" int,int,int,int #func DragQueryPoint "DragQueryPoint" int,int #func DragFinish "DragFinish" int #define WM_DROPFILES 0x0233 screen 0,180,60 title "画像中央配置" ; メッセージ処理の登録 oncmd gosub *OnDropFiles, WM_DROPFILES ; ドロップファイルの受け入れを設定 DragAcceptFiles hwnd, 1 if stat == 0 { dialog "設定に失敗しました。", 1, "エラー" end } xsize = 150 : ysize = 150 r = 0 : g = 255 : b = 0 pos 10,10 : mes "横" : pos 30,10 : input xsize,55,18 pos 90,10 : mes "縦" : pos 110,10 : input ysize,55,18 pos 10,30 : mes "赤" : pos 30,30 : input r,25,18 pos 65,30 : mes "緑" : pos 85,30 : input g,25,18 pos 120,30 : mes "青" : pos 140,30 : input b,25,18 stop *OnDropFiles ; ====== ファイルがドロップされたときの処理 ====== hDrop = wparam ; データ構造体のハンドル ; ファイルの数の取得 DragQueryFile hDrop, -1, 0, 0 ; 第2パラメータを -1 に filecount = stat ; ドロップされたファイル数 ; ファイル名の取得(ドロップされたファイルの数だけ実行) sdim filename, 260 ; ファイル名を格納するバッファ repeat filecount DragQueryFile hDrop, cnt, varptr(filename), 260 buffer 2 : picload filename aa = ginfo(12) : bb = ginfo(13) x = (xsize - aa) / 2 : y = (ysize - bb) / 2 pget 1,1 : gmode 4,,,256 buffer 3,xsize,ysize : color r,g,b : boxf gsel 3 : pos x,y : gcopy 2,0,0,aa,bb cc = getpath(filename,1) gsel 3 : bmpsave cc + "_n.bmp" loop ; ドロップファイル用のメモリを解放 DragFinish hDrop return 0

適当な画像をドラッグ&ドロップすれば、その画像のあった場所に中央に再配置された画像が生成されます。
この際ドラッグ&ドロップした画像の左上の一点と同色を透過して、入力した色にしたいのです。
※ドラック&ドロップの部分は、ちょくと様のソースをそのまま流用していますので問題ないはずです。



Ve

リンク

2009/9/6(Sun) 16:20:45|NO.27561

俺が勘違いしていたようだ。後は任せた。



リンク

2009/9/6(Sun) 17:11:43|NO.27562

buffer命令でウィンドウを初期化したとき、 gmode などで設定したの値は元に戻るので、
gmode 4 は buffer の後に入れないと、ちゃんと動いてくれません。

あと、gmode や color などで設定した値はウィンドウIDごとに管理されます。
↓こんなかんじに

screen 1 color 0, 255, 0 mes "ID 1 緑" gsel 0 mes "ID 0 黒"
というわけで、ウィンドウIDをまたいで設定する工夫が必要です。

別にどうということはありませんが、一応……

buffer 2 : picload filename aa = ginfo(12) : bb = ginfo(13) x = (xsize - aa) / 2 : y = (ysize - bb) / 2 pget 0, 0 ; ウィンドウID2 の一番左上の色を取得 r2 = ginfo_r ; g2 = ginfo_g ; ウィンドウID2 の色を記憶 b2 = ginfo_b ; buffer 3, xsize, ysize ; ウィンドウID3 を初期化 gmodeとかcolorの値はリセット color r, g, b : boxf color r2, g2, b2 ; ココで、記憶した色を設定 gmode 4,,,256 ; buffer 命令でリセットされたので、ここで gmode を設定



匿名

リンク

2009/9/6(Sun) 17:33:01|NO.27563

光様

マニュアルにしっかりと目を通せばなんとでも無い問題だったようで^^;
分かりやすい説明に、サンプルスクリプトまでつけていただいてありがとうございました。

無事、完成しましたので修正したスクリプトを載せて、解決とさせて頂きます。
皆様ありがとうございました。

#packopt name "画像中央配置"
#packopt hide 1 #uselib "shell32.dll" #func DragAcceptFiles "DragAcceptFiles" int,int #func DragQueryFile "DragQueryFileA" int,int,int,int #func DragQueryPoint "DragQueryPoint" int,int #func DragFinish "DragFinish" int #define WM_DROPFILES 0x0233 screen 0,180,60 title "画像中央配置" ; メッセージ処理の登録 oncmd gosub *OnDropFiles, WM_DROPFILES ; ドロップファイルの受け入れを設定 DragAcceptFiles hwnd, 1 if stat == 0 { dialog "設定に失敗しました。", 1, "エラー" end } xsize = 150 : ysize = 150 r = 0 : g = 255 : b = 0 pos 10,10 : mes "横" : pos 30,10 : input xsize,55,18 pos 90,10 : mes "縦" : pos 110,10 : input ysize,55,18 pos 10,30 : mes "赤" : pos 30,30 : input r,25,18 pos 65,30 : mes "緑" : pos 85,30 : input g,25,18 pos 120,30 : mes "青" : pos 140,30 : input b,25,18 stop *OnDropFiles ; ====== ファイルがドロップされたときの処理 ====== hDrop = wparam ; データ構造体のハンドル ; ファイルの数の取得 DragQueryFile hDrop, -1, 0, 0 ; 第2パラメータを -1 に filecount = stat ; ドロップされたファイル数 ; ファイル名の取得(ドロップされたファイルの数だけ実行) sdim filename, 260 ; ファイル名を格納するバッファ repeat filecount DragQueryFile hDrop, cnt, varptr(filename), 260 buffer 2 : picload filename aa = ginfo(12) : bb = ginfo(13) pget 1,1 : r2 = ginfo(16) : g2 = ginfo(17) : b2 = ginfo(18) x = (xsize - aa) / 2 : y = (ysize - bb) / 2 buffer 3,xsize,ysize : color r,g,b : boxf color r2,g2,b2 : gmode 4,,,256 gsel 3 : pos x,y : gcopy 2,0,0,aa,bb cc = getpath(filename,1) gsel 3 : bmpsave cc + "_n.bmp" loop ; ドロップファイル用のメモリを解放 DragFinish hDrop return 0



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