社区
Delphi
帖子详情
请问大家怎样制作一个透明的TImage
VisualLion
2002-11-25 02:45:23
请问大家怎样制作一个透明的TImage,设置Transparent=true怎么无效
...全文
224
17
打赏
收藏
请问大家怎样制作一个透明的TImage
请问大家怎样制作一个透明的TImage,设置Transparent=true怎么无效
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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属性是没用的。
delphi
透明
panel组件或者
制作
方法
//
透明
Panel控件 unit TranPanel; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TGlassStyle = ( gsBlackness, gsDstInvert,...
请问
如何
制作
中国象棋对弈软件的界面部分?
请问
如何
制作
中国象棋对弈软件的界面部分? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiMultimedia/html/delphi_20061111081529159.html 我有对弈程序的源代码,是用C++Builder编写的,但不知怎么
制作
界面? 哪位大侠能帮帮我? 无论是C++Builder版本或D...
BCB图像按钮设计三例 (转)
BCB图像按钮设计三例 (转)[@more@] c++builder按钮设计特效三例 在程序的使用过程中,使用频率最高的可视化组件可以说就是按钮了。如果在我们设计程序时为按钮增加一些特殊的显示效果,那么一定会为你的应...
c++builder按钮设计特效三例
在程序的使用过程中,使用频率最高的可视化组件可以说就是按钮了。如果在我们设计程序时为按钮增加一些特殊的显示效果,那么一定会为你的应用程序增添不少情趣,下面笔者为大家介绍三种特殊图像按钮显示特效,其运行效果如下图所示。 一、实现图像按钮(如图中的开始按钮)在程序设计过程中,使
delphi绘图canvas及应用(转)
delphi绘图canvas及应用2010年03月25日 星期四 14:59DELPHI为编程者提供了
一个
灵活的绘图场所,CANVAS类,在DELPHI中的很多控件都具有此属性,使编程者可以
在这些控件的表面随心所欲的绘图,这对完善用户界面或者
制作
一些屏幕特技都有着非凡的作用。
一、CANVAS必备基本知识
1.具有CANVAS属性的控件
TBitmap,TComboBox,TDBComboBox,TDBGrid,TDBListBo
Delphi
5,930
社区成员
262,936
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章