为何白色不能透明,没人会吗? (100分)

  • 主题发起人 主题发起人 wjp888
  • 开始时间 开始时间
请设置Bitmap的TransparentMode = tmFixed
 
TransparentMode = tmFixed
还是不行。
 
强烈关注!!!!!!!!!!用TImage控件BMP可以透明,但JPEG不可。
 
Glyph.TransparentMode := tmAuto;
Glyph.Transparent := True;
Canvas.Draw(X,Y,Glyph);
 
此贴这个过程是宁柯大侠的KingReport报表中的封面绘图过程,画上去后可以大小调整。
而如果用:Canvas.Draw(X,Y,Glyph); 可能没法调整了。
 
强烈关注!!!!!!!!!!
 
你想简单的用StretchDiBits就可以实现透明效果?

//=====================我加的无任何作用
// Bmp.Modified:=true;
// Bmp.Transparent:=true;
// Bmp.TransparentColor:=clwhite;
// Bmp.Canvas.Draw(0,0,Bmp);
// Bmp.Transparent:= true;
// TransparentBlt(hBm, 0, 0, Bmp.Width, BmP.Height,
// Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, RGB($FF, $FF, $FF));
//======================

当然没有作用。
 
我只知道两种实现透明方法,一是不画指定的颜色的点,二是Mask。
 
使用Mask的方法:
制作两张图:屏蔽图,原图。
运用CopyRect函数:
第一次使用CopyMode:=cmSrcAnd属性进行复制屏蔽图
第二次使用CopyMode:=cmSrcPaint属性进行复制原图。
注意:屏蔽图背景白色,内容黑色。原图背景黑色。
 
如果不是单色的背景的话。BRUSHCOPY里用颜色替换没有效果。。
请先画下背景图片。在这个图片上BRUSHCOPY(RC,YOUBMP。CANVAS,要替换成透明的颜色);
这个是正解。
 
可能你图片中的白色不是clWhite。用photoshop查1下实际颜色是什么,然后
Bmp.TransparentColor:=RGB(???,???,???);
Bmp.Transparent:=true;

 
我这里有一个画透明图片的函数,你看看
procedure DrawTBitmap(AHdc:HDC;Image:TBitmap; x,y:Integer;Col:TColor);
//Col是透明颜色
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;
 
有谁知道这个问题的解决方法吗?
是关于jpg图片和gif图像合并,并生成一张新的jpg图片,jpg图片为背景,gif图片为前景(即gif图片在jpg图片的上面),而且gif图片本来的背景是透明的我用一般的图像合并方法重绘后,gif图片这块的背景变成白的了,谁知道怎么解决?

我要达到的图片效果是:http://www.yeagen.com/other/yes.jpg
而现在我只能达到的效果是:http://www.yeagen.com/other/no.jpg

问题原文:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2575718
 
后退
顶部