图像背景透明和叠加(100分)

  • 主题发起人 主题发起人 vipxjj
  • 开始时间 开始时间
V

vipxjj

Unregistered / Unconfirmed
GUEST, unregistred user!
在一幅底图上,叠加另一幅前景图像。
前景图像的背景是白色的(有过渡的颜色,主要是白色)!
基本透明我已做到了(用Transparent属性)。但是过度的白颜色无法去掉!

要求:去除前景图像的背景包括过渡的浅白色,最好能让前景图像带有点透明的效果!
论坛中找了许多有关的问答,但不能很好的解决问题!
(不想用第三方控件)恳请各位大侠不吝赐教!
 
实用技术论坛中不好找的[:D]
 
学习中。
 
如果是24位及以下的图像,处理透明度,就不好处理,
如果是32位图像,有Alpha通道,要什么透明都可以,
 
谢谢各位参与!是24位的图像!
 
用Alpha,处理应该不复杂,推荐GDI+!
 
"寻路"
能说得清楚些吗?我对之方面不太了解!
 
"delphi_delphi"
指的网址有病毒!大家不要上当!
 
怎没更好的建意呀?给个思路也行!
 
建立2个BITMAP,一个取前景的未图,一个取背景和前景重叠的位图,对前景的位图栅格扫描,如果是白色,则取相应栅格的背景色。这样就可以去除前景不需要的图片。
另外这么做,前景的过度的白色还是会有,最好用图片编辑工具,将所有过度的白色修改成纯白,就不会有白边了。

front,back : TBitMap;
...
for j:=0 to front.Height -1 do
begin
for k:=0 to (front.Width)-1 do
begin
if front.Canvas.Pixels[j,k]=clWhite then
front.Canvas.Pixels[j,k]:=back.Canvas.Pixels[j,k];
end;

end;
 
忘记说了,最后用StretchBlt函数将front贴回去,指定StretchBlt的最后一个参数可以使front有透明效果。
 
一个老外写的程序,请仔细看!!!
对你肯定有帮助:
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls;

type
TForm1 = class(TForm)
ImgBackground1: TImage;
ImgTransparent1: TImage;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label1: TLabel;
Label2: TLabel;
ImgSprite1: TImage;
ImgMask1: TImage;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
imgDrawn1: TImage;
Label7: TLabel;
Button1: TButton;
procedure SpinEdit1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
initialized: boolean; // used to indicate when the sprite and mask are made
implementation

{$R *.DFM}
procedure initialize;
const TranspColour=clBlack; // the colour of pixels that will be made invisible
begin // creates the mask and sprite
with form1 do
begin
imgMask1.Height:=imgTransparent1.Height;
imgMask1.Width:=imgTransparent1.Width;
imgSprite1.Height:=imgTransparent1.Height;
imgSprite1.Width:=imgTransparent1.Width;
// now the images have their dimensions equal
// Now, start creating the Mask
imgMask1.Canvas.Draw(0,0,imgTransparent1.Picture.Bitmap);// copy the image
imgMask1.Picture.Bitmap.Mask(TranspColour);
// The mask is now created.
//Now, start creating the sprite
imgSprite1.Canvas.Draw(0,0,imgMask1.Picture.Bitmap);
imgSprite1.Canvas.Pen.Mode:=pmnot; // not mode for inverting the colours of the mask
imgSprite1.Canvas.Rectangle(-1,-1,imgSprite1.Width+1,imgSprite1.Height+1);
// invert colours of the mask
imgSprite1.Canvas.CopyMode:=cmSrcAnd; // and mode
imgSprite1.Canvas.Draw(0,0,imgTransparent1.Picture.Bitmap);
// Sprite is now created.
imgDrawn1.Height:=imgBackground1.Height;
imgDrawn1.Width:=imgBackground1.Width;
// the background now has the dimensions of the background
end;
initialized:=true;
// indicate that the mask, and sprite has been created
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
// Draw the transparent bitmap
var
x,y: integer; // top,left coordinates of the transparent graphic
begin
if not initialized then
initialize; // Create the mask and sprite, if hasn't been done yet.
x:=spinedit1.value;
y:=spinedit2.value; // get the input coordinates
imgDrawn1.Canvas.Draw(0,0,imgBackground1.Picture.Bitmap); // copy the background into the image
imgDrawn1.Canvas.CopyMode:=cmSrcAnd; // and mode
imgDrawn1.Canvas.Draw(x,y,imgMask1.Picture.Bitmap);
// Mask drawn
imgDrawn1.Canvas.CopyMode:=cmSrcPaint; // or mode
imgDrawn1.Canvas.Draw(x,y,imgSprite1.Picture.Bitmap);
imgDrawn1.Canvas.CopyMode:=cmSrcCopy; // the normal mode
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
initialized:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin // initialize
initialize;
end;
 
刚才做的说明怎么提交不上来??

重新来过:
把imgBackground1中的图片加到imgDrawn1中,
用imgDrawn1图片作为前景图片在imgDrawn1中移动,
不会出现白色,
具体自己看,俺水平有限:)
 
你可以使用第三方组件BS,将一些组件放入窗口后,设置一个A什么的属性(就是一个组件在对象查看器中的第2个属性),我有点记不清了!
还可以设置他的透明度
 
控制前景透明度就是计算前景和背景的每一点rgb值的混合值
 
补充:
例如:
r(new)=r(前)*0。2+r(背)*0。8
g(new)=g(前)*0。2+g(背)*0。8
b(new)=b(前)*0。2+r(背)*0。8
 

Similar threads

I
回复
0
查看
644
import
I
I
回复
0
查看
794
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部