请问大家怎样制作一个透明的TImage

VisualLion 2002-11-25 02:45:23
请问大家怎样制作一个透明的TImage,设置Transparent=true怎么无效
...全文
194 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
HOOK_TTG 2002-12-02
  • 打赏
  • 举报
回复
噢!你要得到地半透明还是去掉不需要的颜色啊!!
下面是,实现半透明的方法,是我以前用VC++做的,现在把发放发告诉你
(1)取出源位图的各个像素点,可以用ScanLine加快速度!
将其RGB*(100%-透明度),并保存到一个数组中
(2)取出背景图与源位图对应的像素点,运算RGB*(100%-透明度)放入另一个数组中
(3)将上面的两个二维数组相加,就得到半透明的色彩了
假如你想要得是透明度30%的话;
也就是这个运算:半透明色=源图色彩*(100%-30%)+背景色彩*30%
但是要注意的是,在win9x中只能用50%透明度,否则会出错;
而在,win2000下就没事了
祝你好运!!

这回可得给我加分吧!!!!!!!
HOOK_TTG 2002-12-02
  • 打赏
  • 举报
回复
这是改进后的,你再试试……
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
Bevel6: TBevel;
Bevel7: TBevel;
Bevel8: TBevel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ListBox1: TListBox;
yuanImage: TImage;
pingimage: TImage;
backImage: TImage;
louImage: TImage;
procedure ListBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ListBox1Click(Sender: TObject);
var
bmpxor,bmpand,bmpinvand,bmpCopy:TBitmap;
oldcol:Longint;
begin
bmpand:=TBitmap.Create;
bmpand.Height:=yuanimage.Height;
bmpand.Width:=yuanimage.Width;
bmpand.Monochrome:=true;
oldcol:=setbkcolor(yuanimage.canvas.handle,colortorgb(clblack));
bitblt(bmpand.canvas.handle,0,0,yuanimage.width,yuanimage.height,
yuanimage.canvas.handle,0,0,SRCCOPY);
setbkcolor(yuanimage.canvas.handle,colortorgb(oldcol));
bmpinvand:=TBitmap.Create;
bmpinvand.Height:=yuanimage.Height;
bmpinvand.Width:=yuanimage.Width;
bmpinvand.Monochrome:=true;
bitblt(bmpinvand.canvas.handle,0,0,yuanimage.width,yuanimage.height,
bmpand.canvas.handle,0,0,NOTSRCCOPY);
bmpxor:=TBitmap.Create;
bmpxor.Height:=yuanimage.Height;
bmpxor.Width:=yuanimage.Width;
bmpxor.Monochrome:=true;
bmpxor.Mask(clblack);
bitblt(bmpxor.canvas.handle,0,0,yuanimage.width,yuanimage.height,
bmpinvand.canvas.handle,0,0,SRCINVERT);
pingimage.Picture.Bitmap:=bmpxor;
bmpCopy:=TBitmap.Create;
bmpCopy.Height:=yuanimage.Height;
bmpCopy.Width:=yuanimage.Width;
bitblt(bmpCopy.canvas.handle,0,0,yuanimage.width,yuanimage.height,
backimage.canvas.handle,0,0,SRCCOPY);
bitblt(bmpCopy.canvas.handle,0,0,yuanimage.width,yuanimage.height,
bmpxor.canvas.handle,0,0,SRCAND);
bitblt(bmpCopy.canvas.handle,0,0,yuanimage.width,yuanimage.height,
yuanimage.canvas.handle,0,0,SRCPAINT);
louimage.Picture.Bitmap:=bmpCopy;
bmpxor.FreeImage;
bmpCopy.FreeImage;
bmpinvand.FreeImage;
end;

end.
HOOK_TTG 2002-12-02
  • 打赏
  • 举报
回复
这是我编的一个程序,用到了你说的知识,希望对有所帮助!!
主要就是“位的屏蔽”
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure DrawTransparentBmp(Cnv: HDC; x
,y: Integer; Bmp: TBitmap;
clTransparent: TColor);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
var
x:integer=10;
y:integer=10;
procedure TForm1.DrawTransparentBmp(Cnv: HDC; x
,y: Integer; Bmp: TBitmap;
clTransparent: TColor);
var
bmpXOR,bmpAND,bmpINVAND,bmpTarget: TBitmap;
oldcol: Longint;
begin
try
bmpAND := TBitmap.Create;
bmpAND.Width := Bmp.Width;
bmpAND.Height := Bmp.Height;
bmpAND.Monochrome := True;
oldcol := SetBkColor(Bmp.Canvas.Handle,ColorToRGB(clTransparent));
BitBlt(bmpAND.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,
Bmp.Canvas.Handle,0,0,SRCCOPY);
SetBkColor(Bmp.Canvas.Handle,oldcol);
bmpINVAND := TBitmap.Create;
bmpINVAND.Width := Bmp.Width;
bmpINVAND.Height := Bmp.Height;
bmpINVAND.Monochrome := True;
BitBlt(bmpINVAND.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,
bmpAND.Canvas.Handle,0,0,NOTSRCCOPY);
bmpXOR := TBitmap.Create;
bmpXOR.Width := Bmp.Width;
bmpXOR.Height := Bmp.Height;
BitBlt(bmpXOR.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,
Bmp.Canvas.Handle,0,0,SRCCOPY);
BitBlt(bmpXOR.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,
bmpINVAND.Canvas.Handle,0,0,SRCAND);
bmpTarget := TBitmap.Create;
bmpTarget.Width := Bmp.Width;
bmpTarget.Height := Bmp.Height;
BitBlt(bmpTarget.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,
Cnv,x,y,SRCCOPY);
BitBlt(bmpTarget.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,
bmpAND.Canvas.Handle,0,0,SRCAND);
BitBlt(bmpTarget.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,
bmpXOR.Canvas.Handle,0,0,SRCINVERT);
BitBlt(Cnv,x,y,Bmp.Width,Bmp.Height,
bmpTarget.Canvas.Handle,0,0,SRCCOPY);
finally
bmpXOR.Free;
bmpAND.Free;
bmpINVAND.Free;
bmpTarget.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
x:=x+10;
y:=y+5;
DrawTransparentBmp(GETDC(0),x,y,image1.Picture.Bitmap,clWhite);
end;

end.
VisualLion 2002-11-26
  • 打赏
  • 举报
回复
是这样的,我的半透明图像所承载的图片是有立体效果的啊,比如中间亮,然后向两边逐渐变暗,就像一个柱子。
VisualLion 2002-11-26
  • 打赏
  • 举报
回复
而且颜色好像也失真
VisualLion 2002-11-26
  • 打赏
  • 举报
回复
我试过了,速度太慢啊。
cnsuyong 2002-11-26
  • 打赏
  • 举报
回复
呵呵,在你的Canvas中进行亮度渐变是最佳选择,至少是效率最高的选择。
cnsuyong 2002-11-25
  • 打赏
  • 举报
回复
不管是透明还是半透明(其实透明是半透明的极端情况而已),只要图层之间发生相对运动,那么在前端显示图片就必需进行重新计算。实际上,就是PSD格式的图象,也只是存储数据比较精确而已,实际上在一个视图窗口中看到的永远是图层根据效果合成的一幅图象而已。
还有,俺不明白为什么用半透明的图象遮罩背景图象就会有立体效果?明明只是半透明效果嘛,就象你用金山词霸屏幕取词时的效果那样(尽管半透明但确实难看)。
VisualLion 2002-11-25
  • 打赏
  • 举报
回复
不是吧
我把一个半透明的图片“附着”在组件上方(前方),透过他看下面的图片,在视觉上起到立体的效果
cnsuyong 2002-11-25
  • 打赏
  • 举报
回复
首先,图象滚动如果使用Canvas.CopyRect方法则不会“慢”,除非运动图象的尺寸特别大。
第二,你用半透明的TImage“附着”在组件上方(前方),只是把遮罩效果所必须的运算处理从一个对象转嫁到另一个对象而已。
VisualLion 2002-11-25
  • 打赏
  • 举报
回复
是这样的,我的组件中无缝连接了一批图片,而同时只能现实其中的若干幅,我的组件从而相应实现了滚动现实功能。进一步,我想把组件做出立体效果,好像一个可以滚动的画轴,经过分析,若直接对图片的像素进行雾化等特效处理速度很慢,所以我想做一个半透明的TImage符在组件上,这个Image显示一个立体的特效图,与下面的显现图片效果叠加,这样对欲显示图片的滚动不会带来大量的运算。
cnsuyong 2002-11-25
  • 打赏
  • 举报
回复
呵呵,楼主你到底是让图片透明还是半透明呢?
俺理解透明是指过滤掉指定的颜色,用背景相应位置的颜色代替。
而半透明则是金山词霸之类“混合”前景与背景,就象CCTV电视信号中的台标那样。
如果是前者,楼上已经有讨论,俺也给你发过邮件了。
如果是后者,则需要进行特殊的图象处理:
一、获得背景图象数据;
二、“混合”处理。通常,还是要进行透明处理,即过滤掉指定的颜色,然后用背景图中相应位置的象素降低(或增加)亮度之后代替。
至于如何调整亮度,则是设计调色板和图形图象范畴的知识了。你可以参考Windows 98中“桌面|属性|外观”中调出的调色板,那里就有RGB调色、(色调、饱和度、亮度)调色的对应值关系。

祝你好运!
winsock2000 2002-11-25
  • 打赏
  • 举报
回复
楼主应该是把IMAGE有透明的感觉!这个问题我也想知道一下!
VisualLion 2002-11-25
  • 打赏
  • 举报
回复
就像将TForm的属性AlphaBlend设置成True一样
killlaoli 2002-11-25
  • 打赏
  • 举报
回复
朋友想要的透明效果是什么样的?我不太理解,说出来大家一起讨论讨论如何?我试了一下,设置transparent为true后,确实有零星几个地方透出了背景的颜色,不过感觉很别扭,不知这样有什么好处。
VisualLion 2002-11-25
  • 打赏
  • 举报
回复
I know.It's TBitmap just.
killlaoli 2002-11-25
  • 打赏
  • 举报
回复
delphi帮助里写的:
Transparent has no effect unless the Picture property specifies a TBitmap object.
朋友的E文应该比我好,这句的意思是说如果picture的属性不指定为TBitmap对象的话,transparent属性是没用的。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧