图像翻转(镜像)(100分)

  • 主题发起人 主题发起人 NetBird
  • 开始时间 开始时间
N

NetBird

Unregistered / Unconfirmed
GUEST, unregistred user!
谁知道怎样做图像的镜像?
最好能在原来的image中直接显示镜像结果
 
不满意的话你自己改造一下吧
//用BitBlt垂直镜像,效果如图3 所示
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.repaint;
if bitmap.height<=form1.height div 2
then numm:=bitmap.height
else numm:=form1.height div 2;
for i:=0 to numm do
begin
bitblt(form1.canvas.handle,0,i,bitmap.width,i,
bitmap.canvas.handle,0,bitmap.height-i,srccopy);
end;
end;
//用BitBlt水平镜像,效果如图4 所示
procedure TForm1.Button4Click(Sender: TObject);
begin
form1.repaint;
if bitmap.width<=form1.width div 2
then numm:=bitmap.width
else numm:=form1.width div 2;
for i:=0 to numm do
begin
bitblt(form1.canvas.handle,i,0,i,bitmap.height,
bitmap.canvas.handle,bitmap.width-i,0,srccopy);
end;
end;
 
procedure TMainForm.N16Click(Sender: TObject);
var
I,J :integer;
p,p1 :PByteArray;
Bmp,Bmp1 :TBitmap;
begin
Bmp :=TBitmap.Create;
Bmp.Assign(MainImage.Picture.Bitmap);
Bmp1 :=TBitmap.Create ;
Bmp1.Assign(MainImage.Picture.Bitmap);
case (Sender as TMenuItem).Tag of
1://///////////水平镜像
begin
for J :=0 to Bmp.Height-1 do
begin
p :=Bmp.ScanLine[J];
P1 :=Bmp1.ScanLine[J];
for I :=0 to Bmp.Width-1 do
begin
p1[3*(Bmp.Width-1-I)+2] :=p[3*I+2];
p1[3*(Bmp.Width-1-I)+1] :=p[3*I+1];
p1[3*(Bmp.Width-1-I)] :=p[3*I];
end;
end;
BitBlt(MainImage.Canvas.Handle,0,0,MainImage.Width,MainImage.Height,
Bmp1.Canvas.Handle,0,0,SRCCOPY);
end;
2://////////////////垂直镜像
begin
for J :=0 to Bmp.Height-1 do
begin
p :=Bmp.ScanLine[J];
P1 :=Bmp1.ScanLine[Bmp.Height-1-J];
for I :=0 to Bmp.Width-1 do
begin
p1[3*I+2] :=p[3*I+2];
p1[3*I+1] :=p[3*I+1];
p1[3*I] :=p[3*I];
end;
end;
BitBlt(MainImage.Canvas.Handle,0,0,MainImage.Width,MainImage.Height,
Bmp1.Canvas.Handle,0,0,SRCCOPY);
end;
end;
Bmp.Free;
Bmp1.Free;
end;
 
wjiachun用的bitblt 速度应该是最快的。
 
使用CopyRect()方法方便又省事,而且他的原理和bitblt是一样的.(具体用法可以参见
Timage控件的方法)
 
卷起千堆雪tyn的方法较好,参照他的思路可以作好多事情。
 
以上算法都不是最好的,可以实现,其实只要用用strethbit就可以了,左右镜像只要将目标的
点用width,0, 后面再是-width, height, 别的就没什么。
 
多人接受答案了。
 
后退
顶部