图像水平翻转后为什么会多出一条白线?我有三幅同样大小(背景为黑色)的图,分别是指向下\右\上,我想把右
图像水平翻转后为什么会多出一条白线?
我有三幅同样大小(背景为黑色)的图,分别是指向"下\右\上",我想把"右"进行水平翻转变成"左",然后把四幅图水平并列画成一幅图,结果发现前三幅图拼接是正常的,但第四幅图与前三幅图之间多了一条线.程序中用的代码如下,大家帮看看是怎么回事?
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;
[解决办法]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坐标这一像素不会保留,从而从源图少了一像素列没拷过去,所以加一个一像素偏移,得到完整镜像