怎样将两副BMP图象进行异或操作(50分)

  • 主题发起人 主题发起人 xsjs
  • 开始时间 开始时间
X

xsjs

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
请问怎样将两副BMP图象进行异或操作,最好给出辕马。
 
假设一幅放在Image1中,另一幅放在Image2中,结果放在Image1中
Image1.Canvas.CopyMode:=cmPatInvert
Image1.Canvas.CopyRect(Image1.ClientRect,Image2.Canvas,Image2.ClientRect);
 
错了!
CopyMode应该是cmSrcInvert, 不是cmPatInvert
 
>>caowei
谢谢指正,刚才粘贴的时候粘错了,的确应为cmSrcInvert。
 
使用 Windows API 函数
BOOL BitBlt(
HDC hdcDest, // 目标位图设备环境,对应TCanvas.Handle
int nXDest, // 目标位图截取区左上角x轴
int nYDest, // 目标位图截取区左上角y轴
int nWidth, // 目标位图截取区宽
int nHeight, // 目标位图截取区高
HDC hdcSrc, // 源位图设备环境,对应TCanvas.Handle
int nXSrc, // 源位图截取区左上角x轴
int nYSrc, // 源位图截取区左上角y轴
DWORD dwRop // 操作模式
);
其中 dwRop 设为 PATINVERT 即可

 
请大家继续讨论
 
我写个简单的
用ScanLine,这必须是24bit的。你可以先转化成。
如果两个图不是一样大的,你自己要判断

for J:=0 to Bmp.Height - 1 do
begin
P1 := Bmp.ScanLine[J];
P2 := Bmp1.ScanLine[J];
for I:=0 to Bmp.Width - 1 do
begin
P1[3*I] := P1[3*I] Xor P2[3*I];
P1[3*I+1] := P1[3*I+1] Xor P2[3*I+1];
P1[3*I+2] := P1[3*I+2] Xor P2[3*I+2];
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp1,Bmp2 :TBitmap;
begin
Bmp1 :=TBitmap.Create;
Bmp1.LoadFromFile('e:/图片/end004.bmp');
Bmp2 :=TBitmap.Create;
Bmp2.LoadFromFile('e:/图片/yunwen3.bmp');
BitBlt(Bmp2.Canvas.Handle,0,0,Bmp2.Width,Bmp2.Height,Bmp1.Canvas.Handle,0,0,SRCINVERT);
Image1.Picture.Bitmap.Assign(Bmp2);
Bmp1.Free;
Bmp2.Free;
end;
 
卷起千堆雪的好像更快些,以上说的都可以实现,但是最好比较一下他们的尺寸,
或者其他的什么
 
惨了,俺花了100大洋问了和你一样的问题!
你给俺点分,到俺那里,俺在给你点分,如何?
lid=538113
相互救济吧^_^
 
我试了钱堆血的代码了,结果是黑色的图片!!不知异或的效果是什么,
 
后退
顶部