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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1027
rixu画像変形?4解決


rixu

リンク

2012/10/27(Sat) 02:36:13|NO.50261

WindowsのXPくらいにあったスクリーンセーバーで、
ズームレンズのようなものが画面をウロウロするのがありました。

HSPで似たようなものを作ろうと思いましたが、
どういう処理をしているのかわかりません。
あのズームのような効果の名前もわかりません。

どなたか教えてください。



この記事に返信する


玄冬

リンク

2012/10/27(Sat) 11:53:04|NO.50269


#define zoom_W 160 ;拡大元の範囲の幅 #define zoom_H 160 ;拡大元の範囲の高さ #define POWER 1.25 ;拡大率 ;適当な画像を生成 buffer 1,640, 640 WIN_W = ginfo_winx WIN_H = ginfo_winy repeat 16*16 X = 40*(cnt \ 16) Y = 40*(cnt / 16) if (((cnt/16)+(cnt \ 16)) \ 2) : color $FF,X/3,Y/3 : else : color Y/3, $FF, X/3 boxf X, Y, X + 40, Y + 40 loop screen 0,WIN_W,WIN_H ;画像サイズに合わせてスクリーン X = 0 : Y = 0 ;拡大枠初期位置 repeat -1 ;拡大位置移動 if WIN_W - POWER * zoom_W < X : Y += 1 if WIN_H - POWER * zoom_H < Y : X -= 1 if X <= 0 : Y -= 1 if Y <= 0 : X += 1 ;拡大 redraw 1 redraw 2 gcopy 1, X, Y, WIN_W, WIN_H pos X,Y gzoom POWER * zoom_W, POWER * zoom_H, 1,X, Y, zoom_W, zoom_H ;拡大枠描画 color 0,0,0 line X, Y + POWER * zoom_H, x, y line X + POWER * zoom_W, Y + POWER * zoom_H line X + POWER * zoom_W, Y line X, Y ;待機 await 20 loop
そのスクリーンセーバーを見たことがないので
わかりませんがこういうことでしょうか?

アルファブレンドを用いれば四角以外の形にも
拡大できそうですね。



rixu

リンク

2012/10/27(Sat) 13:19:41|NO.50273

解決しました。
それっぽい感じになりました。
ありがとうございます。


#define zoom_W 200 ;拡大元の範囲の幅 #define zoom_H 200 ;拡大元の範囲の高さ ;適当な画像を生成 buffer 1,640, 640 WIN_W = ginfo_winx WIN_H = ginfo_winy repeat 16*16 X = 40*(cnt \ 16) Y = 40*(cnt / 16) if (((cnt/16)+(cnt \ 16)) \ 2) : color $FF,X/3,Y/3 : else : color Y/3, $FF, X/3 boxf X, Y, X + 40, Y + 40 loop screen 0,WIN_W,WIN_H ;画像サイズに合わせてスクリーン X = 0 : Y = 0 ;拡大枠初期位置 repeat -1 ;拡大位置移動 X=WIN_W/2+200.0*cos(deg2rad(cnt)) Y=WIN_W/2+200.0*sin(deg2rad(cnt)) ;拡大 redraw 1 redraw 2 pos 0,0 gcopy 1, 0, 0, WIN_W, WIN_H repeat 20 pos X,Y gmode 2,zoom_W-cnt*10,zoom_H-cnt*10,256 grotate 1, X+cnt*5-zoom_W/2,Y+cnt*5-zoom_H/2 , 0.0 , zoom_W-cnt*9,zoom_H-cnt*9 ;待機 loop await 20 loop



FunnyMaker

リンク

2012/10/27(Sat) 14:24:17|NO.50275

既に解決になっていますが、私からも一つ。

質問者様が聞きたかったのは魚眼レンズの効果なのではないでしょうか?

以下の方法では、変形対象が巨大化するとはかなり時間がかかりますが、
一応魚眼レンズっぽくなります。

仕組みは説明するまでもないかもしれませんが、一応。

虚像の結果だけ考えれば、魚眼レンズは中心にいくほど拡大率がデカいと考えればいいのです。
それをgzoomでゴリ押せばいいのです。
中心の拡大倍率をαとし、外縁の拡大倍率を1とします。ターゲットの正方形を、外側の皮をむきつつ
拡大率を1→αに変化させながらgzoomでコピーします。皮の厚さは1pxにしましょう。
皮は(ターゲットの正方形の1辺の長さ÷2)枚ですよね。
拡大したものは下から順に積み上げればいいのです。ただし、やっぱり丸くないといけませんから、
gmode7で型抜きをして円形にくり抜いたものを重ねてゆきます。


screen 0,500,500,0 color 0,0,0 : boxf color 255,255,255 repeat 500/10/2 cnt1 = cnt;第一階層ループのカウント値を取得 repeat 500/10/2 boxf 10 + cnt*20,cnt1*20,10 + cnt*20 + 9,cnt1*20 + 9 boxf cnt*20,cnt1*20 + 10,cnt*20 + 9,cnt1*20 + 10 + 9 loop loop font msgothic,100,1+16 color 255,0,0 pos 80,200 : mes "HSP万歳" picsize_x = ginfo_winx : picsize_y = ginfo_winy screen 1,picsize_x,picsize_y,0 : gmode 7;ショーウィンドウ buffer 2,1,1,0;作業場 ;正方形の部分のみにしか適用できません。 ;長方形の画像に対して実行したいのなら、余白を付けるなり長辺を削るなりして整形する必要があります。 length_side = picsize_x;用意した画像のxサイズで。今回はたまたま画像が正方形なのでyサイズでもいいです。 CenterMaxMagnification = double(2);中心の最大倍率を3でやってみよう...。 repeat length_side / 2 ;++++++++++作業場に拡大画像を用意して、gmode7用の型抜きの「型」を作成する。+++++++ ;gzoom用の定数を用意 Length_CopyArea = length_side - cnt*2;コピー元エリアの1辺の長さ Pos_CopyArea = cnt;コピー元正方形の左上座標(x,y共通) Length_PasteArea = (double(1) + double(CenterMaxMagnification - double(1)) * double(cnt)/double(length_side / 2)) * Length_CopyArea;貼付ける正方形画像の1辺の長さ Pos_PasteArea = (length_side - Length_PasteArea)/2;貼付先エリアの左上座標(x,y共通) gsel 2,0 if ginfo_winx < Length_PasteArea*2 : buffer 2,Length_PasteArea*2,Length_PasteArea,0 pos 0,0 : gzoom Length_PasteArea,Length_PasteArea,0,Pos_CopyArea,Pos_CopyArea,Length_CopyArea,Length_CopyArea,0;最後のパラをいじるべし color 0,0,0 : boxf Length_PasteArea,0,Length_PasteArea*2 - 1,Length_PasteArea - 1 color 255,255,255 : circle Length_PasteArea,0,Length_PasteArea*2,Length_PasteArea,1 ;++++++++++ショーウィンドウに描く+++++++ gsel 1,0 pos Pos_PasteArea,Pos_PasteArea gcopy 2,0,0,Length_PasteArea,Length_PasteArea await 0 loop dialog "完了"



rixu

リンク

2012/10/27(Sat) 14:58:07|NO.50277

おお、
驚きました。
参考にします。



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