如何实现两张位图图片的合并?(100分)

  • 主题发起人 apolloone
  • 开始时间
A

apolloone

Unregistered / Unconfirmed
GUEST, unregistred user!
实现两张位图图片的合并,image1当前景图(中间镂空透明,如像框),image2当背景图(如照片),
合并后,image2位于image1的后面,并且image2显示在image1镂空的部分上,超出部分不显示。
相当于照片镶嵌在像框里面,最好可以实现照片的移动、放大、缩小等。
 
我觉得应该是Image1作背景,Image2用透明的方法画在Image1上就行了,Image2的位图应该设定一个透明色
HDC MaskDC=CreateCompatibleDC(Bitmap1->Canvas->Handle);
SelectObject(MaskDC, Image2->Picture->Bitmap->MaskHandle);
TransparentStretchBlt(Bitmap1->Canvas->Handle, 0, 0,
Image2->Picture->Width, Image2->Picture->Height,
Image2->Picture->Bitmap->Canvas->Handle, 0, 0,Image2->Picture->Width, Image2->Picture->Height,
MaskDC,0,0);
 
请教redcony先生:这个在Delphi中如何处理呢?

谢谢了

 

procedure TForm1.Button1Click(Sender: TObject);
begin
image1.Picture.Bitmap.TransparentColor := image1.Canvas.Pixels[0,0];//透明颜色
image1.Transparent := true;
image2.Canvas.Brush.Style := bsClear;
image2.Canvas.Draw(0,0,image1.Picture.Graphic);
end;
 
参见Delphi帮助TCanvas-》Draw-》Example
就是楼上那位老兄的办法。
也可以用我说的Api可以在任何画布上实现两个位图的合并
(And,or,xor)等
 
把 Image2 直接放到 Image1 的镂空部分不就行了。
 
但是像框边上如果正好也有和透明色一样的颜色 也变透明了,这个不行啊!

有没有支持图层处理的控件呀?我加20分!!!!

 
关注!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
我想看原代码!
 
谁能给你代码看看?
 
我利用影子的代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
image1.Picture.Bitmap.TransparentColor := image1.Canvas.Pixels[0,0];//透明颜色
image1.Transparent := true;
image2.Canvas.Brush.Style := bsClear;
image2.Canvas.Draw(0,0,image1.Picture.Graphic);
end;
 
这个在VC++ 中可以通过 CImageList 来处理的。
你看看dlephi 中的 TImageList 有没有处理图像的这种功能。
 
怎么处理啊?
 
procedure TForm1.Button9Click(Sender: TObject);
var
MaskDC: HDC;
begin
MaskDC:=CreateCompatibleDC(Image1.Picture.Bitmap.Canvas.Handle);
SelectObject(MaskDC, Image2.Picture.Bitmap.MaskHandle);
TransparentStretchBlt(Image1.Picture.Bitmap.Canvas.Handle, 0, 0,
Image2.Picture.Width, Image2.Picture.Height,
Image2.Picture.Bitmap.Canvas.Handle, 0, 0,
Image2.Picture.Width, Image2.Picture.Height,
MaskDC,0,0);
Image1.Refresh;
end;
 
..............
 
镂空部分就是一个mask, 边缘当然不能和里面一样。
这个是常识。如果边缘颜色也一样,谁也没办法。
一般的mask都是黑白两色的,没有这个问题。
 
>>但是像框边上如果正好也有和透明色一样的颜色 也变透明了,这个不行啊!
为什么要设为同一样颜色?
image1.Canvas.Pixels[0,0];//要Mask的颜色,Pixels[x,y]可以随意设定
 
Mask的颜色是可以随便设,我设置成clWhite也不行啊!边框上的白色也会透明的!!!
 
顶部