图片透明的问题!(一个简单的问题,怎么就是没人会呢?高手哪里去了?!哪里有高手?!) (21分)

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

xinux11

Unregistered / Unconfirmed
GUEST, unregistred user!
比方说:我现在有一张图片A大小是800*600,还有一张图片B,大小是10*10,我怎么把B图片和A图片结合在一起啊?就是说B图片就在A图片的上面,并保存成C文件。有一点类似于photoshop里的两个图层的效果。(注:B图片背景是透明的)
我要达到的图片效果是:http://www.yeagen.com/other/yes.jpg
而现在我只能达到的效果是:http://www.yeagen.com/other/no.jpg
 
自己顶一下下
 
再顶一下下
大概是太晚了,高手都睡觉了吧[:(]
 
分别帮A,B建立TBitmap,然后用A的Canvas.CopyRect把B的全部拷进A中,用A的SaveFromFile保存A图片
 
lzw529:可以实现。

我做这个功能的目的是自己给我编的截图软件,截下来的图加上版权信息,如果是用bmp(版权信息图片有背景色),融入不进截下来的图片中。B图片可不可以加截Gif的?
 
用jpg,gif的原理是一樣的,不知你用jpg有沒有出現問題?
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=7231
 
yostgxf:
用你的代码以后,一执行“合并后的图片放在tmpImage1中”操作时,整个windows就没有响应了.........
 
我用:
procedure TForm1.Button1Click(Sender: TObject);
var
JPEGImage1: TJPEGImage;
JPEGImage2: TGIFImage;
tmpImage1, tmpImage2 :TImage;
ARect :TRect;
AWidth, AHeight :integer;
begin
DoubleBuffered:=true;
tmpImage1 := TImage.Create(Self);
tmpImage2 := TImage.Create(Self);
tmpImage1.AutoSize:=true;
tmpImage2.AutoSize:=true;

//先读入jpeg格式的图片
JPEGImage1 := TJPEGImage.Create;
JPEGImage1.LoadFromFile('d:/a.jpg');
tmpImage1.Picture.Bitmap.Assign(JPEGImage1);
JPEGImage2 := TGifImage.Create;
JPEGImage2.LoadFromFile('d:/bb.gif');
tmpImage2.Picture.Bitmap.Assign(JPEGImage2);
AWidth := tmpImage1.Width;
AHeight:= tmpImage1.Height;
tmpImage1.AutoSize:=false;

bitblt(tmpimage1.Canvas.Handle,0,0,screen.Width,screen.Height,tmpimage2.Canvas.handle,0,0,srccopy);
JPEGImage1.Assign(tmpImage1.Picture.Bitmap);
JPEGImage1.Compress;
JPEGImage1.SaveToFile('d:/c.jpg');
tmpimage1.Free;
tmpimage2.Free;
JPEGImage1.Free;
JPEGImage2.Free;
end;

实现了jpg和gif图片的合并,不过本来背景透明的GIF图片,现在背景变成白色了,怎么解决这个问题啊?
 
我加了tmpImage2.Transparent:=true;好像还是不行,大家帮帮忙~
 
没仔细研究你的问题,给你一个画透明的函数吧。其中Col是透明颜色

procedure DrawTBitmap(AHdc:HDC;Image:TBitmap;x,y:Integer;Col:TColor);
var
TransColor :TColor;
OldBkColor :TColorRef;
bmAndBack, bmAndObject, bmAndMem, bmSave,
bmBackOld, bmObjectOld, bmMemOld, bmSaveOld :HBITMAP;
hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave :HDC;
ptSize :TPoint;
begin
TransColor :=Col or $02000000;

hdcTemp :=CreateCompatibleDc(AHdc);
SelectObject(hdcTemp,Image.Handle);
ptSize.x :=Image.Width ;
ptSize.y :=Image.Height ;
DPtoLP(hdcTemp,ptSize,1);
hdcBack :=CreateCompatibleDc(AHdc);
hdcObject :=CreateCompatibleDc(AHdc);
hdcMem :=CreateCompatibleDc(AHdc);
hdcSave :=CreateCompatibleDc(AHdc);

bmAndBack :=CreateBitmap(ptSize.x,ptSize.y,1,1,nil);
bmAndObject :=CreateBitmap(ptSize.x,ptSize.y,1,1,nil);
bmAndMem :=CreateCompatibleBitmap(AHdc,ptSize.x,ptSize.y);
bmSave :=CreateCompatibleBitmap(AHdc,ptSize.x,ptSize.y);

bmBackOld :=SelectObject(hdcBack,bmAndBack);
bmObjectOld :=SelectObject(hdcObject,bmAndObject);
bmMemOld :=SelectObject(hdcMem,bmAndMem);
bmSaveOld :=SelectObject(hdcSave,bmSave);

SetMapMode(hdcTemp,GetMapMode(AHdc));
BitBlt(hdcSave,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);
OldBkColor :=SetBkColor(hdcTemp,TransColor);
BitBlt(hdcObject,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCCOPY);

SetBkColor(hdcTemp,OldBkColor);
BitBlt(hdcBack,0,0,ptSize.x,ptSize.y,hdcObject,0,0,NOTSRCCOPY);

BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,AHdc,x,y,SRCCOPY);
BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdcObject,0,0,SRCAND);
BitBlt(hdcTemp,0,0,ptSize.x,ptSize.y,hdcBack,0,0,SRCAND);
BitBlt(hdcMem,0,0,ptSize.x,ptSize.y,hdcTemp,0,0,SRCPAINT);
BitBlt(AHdc,x,y,ptSize.x,ptSize.y,hdcMem,0,0,SRCCOPY);
BitBlt(hdcTemp,0,0,ptSize.x,ptSize.y,hdcSave,0,0,SRCCOPY);

DeleteObject(SelectObject(hdcBack,bmBackOld));
DeleteObject(SelectObject(hdcObject,bmObjectOld));
DeleteObject(SelectObject(hdcMem,bmMemOld));
DeleteObject(SelectObject(hdcSave,bmSaveOld));
DeleteDC(hdcMem);
DeleteDC(hdcBack);
DeleteDC(hdcObject);
DeleteDC(hdcSave);
DeleteDC(hdcTemp);
end;
 
这个函数怎么应用到实际操作中啊~~~~
 
谁能帮帮我啊?
 
我查了一下贴子Canvas.BrushCopy好像做透明的,有谁用过的啊?
可以根据我的具体要求给点建议吗?
 
大家来看看啊!!!
 
还没搞定吗?既然你会用bitblt copy图片,为什么不会用我给你的函数呢?
 
HOHO~
我是初学者拉,bitblt copy函数我也是从论坛里找来的,只会依样画葫芦,HOHO
yostgxf,麻烦您,帮我再改一下下好吗?
 
1。你要合并二张图片,只要用Canvas.CopyRect就可以了。
image1.Canvas.CopyRect(DRect,image2.Canvas,SRect);
函数的意思是把image2 SRect区域的图片拷贝到image1的DRect区域

2。在拷贝之前,先把二张图片装到Image中

这个你都会了
 
3。你说你的图片本来是透明的,装到image背景就变成白色的了,我给你一个函数可以转换一下。也就是说重新拷贝一次
 
我要达到的图片效果是:http://www.yeagen.com/other/yes.jpg
而现在我只能达到的效果是:http://www.yeagen.com/other/no.jpg
请看看
 
后退
顶部