怎么达到这样的效果?(100分)

  • 主题发起人 主题发起人 党sir
  • 开始时间 开始时间

党sir

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在在做一个程序,要求如下:
一个时间显示的钟表画面,由于钟表外观都是圆形或者椭圆形的,我想在钟表的内部
(圆形或者椭圆形里面)放上一张图片,但钟表的外部是透明无画面的。如果内部是
单一的颜色,那问题就简单了,问题是现在需要在内部放上一个图片!
 
先裁剪(API我忘记了)画布,再用bitbltAPI画图。
 
实际就是一个圆形的拷贝,先以时钟的轨迹建立一个圆形或者椭圆形的区域,
然后再把图片剪切、拷贝上去!

看看这里我的回答 : http://www.delphibbs.com/delphibbs/dispq.asp?lid=804036
 
AHM控件集里有这样一个控件
 
卷起千堆雪tyn:
你的程序我看了,但有一点无法解决,你的程序我添加2句:
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Bmp :TBitmap;
FRgn :HRGN;
begin
Bmp :=TBitmap.Create;
Bmp.PixelFormat :=Image1.Picture.Bitmap.PixelFormat;
Bmp.Width :=100;
Bmp.Height :=100;
BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,Image1.Canvas.Handle,80,80,SRCCOPY); //要拷贝的位图
FRgn :=CreateEllipticRgn(0,0,100,100);
SelectClipRgn(Image1.Canvas.Handle,FRgn);
Image1.Canvas.Draw(0,0,Bmp);
//添加开始
image1.Canvas.MoveTo(0,0);
image1.Canvas.LineTo(image1.width,image1.Height);
//添加结束
Bmp.Free;
DeleteObject(FRgn);
end;
****************************************
问题如下:划的直线为什么只在指定的圆形区域有效,区域外就无效了(似乎可以理解),
但如果我非要在规定的圆形区域外面显示出直线的其他部分,怎么办?
 
下面这句:
SelectClipRgn(Image1.Canvas.Handle,FRgn); //选择剪切区域,使得只有位于区域内的Image的画布有效
//所以你画的直线位于区域外的部分被剪切掉

至于如何显示区域外的线,你完全可以先画好线,再剪切么。

//添加开始
image1.Canvas.MoveTo(0,0);
image1.Canvas.LineTo(image1.width,image1.Height);
//添加结束
Bmp :=TBitmap.Create;
Bmp.PixelFormat :=Image1.Picture.Bitmap.PixelFormat;
Bmp.Width :=100;
Bmp.Height :=100;
BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,Image1.Canvas.Handle,80,80,SRCCOPY); //要拷贝的位图
FRgn :=CreateEllipticRgn(0,0,100,100);
SelectClipRgn(Image1.Canvas.Handle,FRgn);
Image1.Canvas.Draw(0,0,Bmp);
Bmp.Free;
DeleteObject(FRgn);

当然这样在区域内的线有错位,你可以事先保存临时位图,对临时位图进行剪切操作.
 
卷起千堆雪tyn:
你这样处理当然可以,我的处理办法是再建一个矩形区域来规定image,同样解决问题

另外请教一下
“实现图象的旋转,你用的是最基本的象素操作法;
其实这种方法看起来简单,但是只要图象稍微大一点,它的操作速度就会很慢。
建议你用扫描线的方法,也就是ScanLine来实现旋转,它是整行整行的操作,速度绝对快。“
你说的这段话,我参考了程序,虽说用了ScanLine方法,但也必须对ScanLine的每一点
进行操作,似乎和象素操作没有太大的区别,为什么速度会提高呢?又怎么说是整行操作呢?

 
多人接受答案了。
 
后退
顶部