|
|
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"
上記の様な感じで、画像を任意の大きさ・色の中央に再配置して保存するというものです。
その際、読み込んだ画像の左上と同じ色を透過したいのですが、上手く重なりません。
中央には配置されますが、透過されないまま保存されてしまいます。
自分でも色々試行錯誤重ねているのですが、どなたか原因を教えて頂けませんか?
|
|
2009/9/6(Sun) 14:24:53|NO.27552
ginfo_r,ginfo_g,ginfo_bでは?
|
|
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
適当な画像をドラッグ&ドロップすれば、その画像のあった場所に中央に再配置された画像が生成されます。
この際ドラッグ&ドロップした画像の左上の一点と同色を透過して、入力した色にしたいのです。
※ドラック&ドロップの部分は、ちょくと様のソースをそのまま流用していますので問題ないはずです。
| |
|
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
| |
|