如何进行图象的这种特技显现?(50分)

  • 主题发起人 主题发起人 zzw
  • 开始时间 开始时间
Z

zzw

Unregistered / Unconfirmed
GUEST, unregistred user!
如何进行图象的这种特技处理:
屏幕全黑,以中心为圆心,一个扇形由0度展开到360度,图象在展开的区域内显示。
 
写一个小函数对每点进行映射
 
本站控件库中有 FxImg11.zip 试试看。
 
做二个位图,一为原图,一为黑白二值图,做特技时,在二值图上画扇型,画时二个
再做一下异或处理,
 
呵呵, 您可以使用SetWindowRgn()这个Win32GDI API来达到要求, 只需要
根据扇形在窗口中的位置作出相应的Region, 然后使用这个GDI API, every
thing is OK, wonderful!
 
当然全黑的背景窗口还是要的呦!
不然, ...
 
SetClipRgn设置剪裁区
 
那个什么FxImg11.zip控件怎么down不下来啊!
 
自己写,用CopyRect,每过0.2秒复制一条,一个简单的算法,真的很简单!
稍微复杂一点的:
马赛克:每次随即复制,一个小正方形,到一定次数,一次性把屏幕写满。
中心散开:定义中心,每次把RECT的高和宽增加
没有什么复杂


哪个空间到处都有
 
本人专门为zzw作了以下的通用函数, 试试调用一下,正好能够解决你的问题。

procedure Display( Canvas : TCanvas; bmp : TBitmap; rect : TRect );
//功能:以逆时针方向逐渐显示一幅位图.
//Canvas : 窗口的Canvas;
//bmp : 待显示的位图;
//rect : 显示区域
var
i, a, b, x0, y0, x, y : Integer;
d : Extended;
r : TRect;
Membmp : TBitmap;
begin
a := ( rect.right - rect.left ) div 2; //椭圆横轴
b := ( rect.bottom - rect.top ) div 2; //椭圆纵轴
x0 := rect.Left + a; //椭圆中心
y0 := rect.Top + b; //

r.Left := 0;
r.Top := 0;
r.Right := 2 * a;
r.Bottom := 2 * b;

Membmp := TBitmap.Create; //建立等大的内存位图
Membmp.Width := 2 * a;
Membmp.Height := 2 * b;

Membmp.Canvas.Brush.Color := clBlack; //涂黑
Membmp.Canvas.FillRect( r );
Membmp.Canvas.Brush.Color := clWhite;
for i := 1 to 36 do
begin
d := i / 18 * 3.1415926;
x := x0 + Round( a * Cos( d ) );
y := y0 - Round( b * Sin( d ) );
//用白色画扇形
if ( i = 36 ) then
Membmp.Canvas.Ellipse( x0 - a, y0 - b, x0 + a, y0 + b )
else
Membmp.Canvas.Pie( x0 - a, y0 - b, x0 + a, y0 + b, x0 + a, y0, x, y );
Membmp.Canvas.CopyMode := cmSrcAnd;
//显示位图的扇形区域
Membmp.Canvas.CopyRect( r, bmp.Canvas, r );
Canvas.CopyRect( rect, Membmp.Canvas, r );
end;
Membmp.Free;
end;
 
本人专门为zzw作了以下的通用函数, 试试调用一下,正好能够解决你的问题。

procedure Display( Canvas : TCanvas; bmp : TBitmap; rect : TRect );
//功能:以逆时针方向逐渐显示一幅位图.
//Canvas : 窗口的Canvas;
//bmp : 待显示的位图;
//rect : 显示区域
var
i, a, b, x0, y0, x, y : Integer;
d : Extended;
r : TRect;
Membmp : TBitmap;
begin
a := ( rect.right - rect.left ) div 2; //椭圆横轴
b := ( rect.bottom - rect.top ) div 2; //椭圆纵轴
x0 := rect.Left + a; //椭圆中心
y0 := rect.Top + b; //

r.Left := 0;
r.Top := 0;
r.Right := 2 * a;
r.Bottom := 2 * b;

Membmp := TBitmap.Create; //建立等大的内存位图
Membmp.Width := 2 * a;
Membmp.Height := 2 * b;

Membmp.Canvas.Brush.Color := clBlack; //涂黑
Membmp.Canvas.FillRect( r );
Membmp.Canvas.Brush.Color := clWhite;
for i := 1 to 36 do
begin
d := i / 18 * 3.1415926;
x := x0 + Round( a * Cos( d ) );
y := y0 - Round( b * Sin( d ) );
//用白色画扇形
if ( i = 36 ) then
Membmp.Canvas.Ellipse( x0 - a, y0 - b, x0 + a, y0 + b )
else
Membmp.Canvas.Pie( x0 - a, y0 - b, x0 + a, y0 + b, x0 + a, y0, x, y );
Membmp.Canvas.CopyMode := cmSrcAnd;
//显示位图的扇形区域
Membmp.Canvas.CopyRect( r, bmp.Canvas, r );
Canvas.CopyRect( rect, Membmp.Canvas, r );
end;
Membmp.Free;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
621
import
I
I
回复
0
查看
602
import
I
后退
顶部