读书人

图像水平翻转后为啥会多出一条白线

发布时间: 2012-12-29 10:28:09 作者: rapoo

图像水平翻转后为什么会多出一条白线?
我有三幅同样大小(背景为黑色)的图,分别是指向"下\右\上",我想把"右"进行水平翻转变成"左",然后把四幅图水平并列画成一幅图,结果发现前三幅图拼接是正常的,但第四幅图与前三幅图之间多了一条线.程序中用的代码如下,大家帮看看是怎么回事?


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坐标这一像素不会保留,从而从源图少了一像素列没拷过去,所以加一个一像素偏移,得到完整镜像

读书人网 >.NET

热点推荐