我有三幅同样大小(背景为黑色)的图,分别是指向"下\右\上",我想把"右"进行水平翻转变成"左",然后把四幅图水平并列画成一幅图,结果发现前三幅图拼接是正常的,但第四幅图与前三幅图之间多了一条线.程序中用的代码如下,大家帮看看是怎么回事?var
  bmps:array [0..3] of TBitmap;
  bmp,newBmp:TBitmap;
  i,x,y:integer;
  SrcR,DesR:TRect;begin
  //初始化及读取前三幅图略  x:=bmps[1].Width;
  y:=bmps[1].Height;
  SrcR:=Rect(0, 0, x, y);
  DesR:=Rect(x, 0, 0, y);
  bmp.Width := x;
  bmp.Height := y;
  bmp.Canvas.CopyRect(DesR, bmps[1].Canvas, SrcR);
  bmps[3].Assign(bmp);
  
  newBmp.SetSize(bmps[0].Width * 4, bmps[0].Height);
  for i := 0 to 3 do
    newBmp.Canvas.Draw( i * bmps[0].Width , 0 , Bmps[i]);  //其他略
end;

解决方案 »

  1.   

    DesR:=Rect(x, 0, 0, y);
    改为
    DesR:=Rect(x - 1, 0, - 1, y);

      StretchBlt(Bmp.Canvas.Handle, 0, 0, X, Y,
                 bmps[1].canvas.Handle,X-1,0,-X,Y,
                 SrcCopy);
    或是用scanline方法做镜像我查了下,那个copyrect最终调用的是StrechBlt,这个API设计的比较巧妙,具体可以查一下,出现那个折线,打个比方,以Y轴镜像,那个Y=0坐标这一像素不会保留,从而从源图少了一像素列没拷过去,所以加一个一像素偏移,得到完整镜像