ImageList图片透明显示问题,XP下,16位色显示属性和32色显示属性显示不同。

ImageList图片透明显示问题,XP下,16位色显示属性和32色显示属性显示不同。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiMultimedia/html/delphi_2006120700102477.html
从ImageList1中调出一幅位图,显示在Image1中,Image1.Transparent设为true。在16位色显示下,图片是透明的;在32位色显示下,图片周边的白色方框依然显示出来。  
   
  将显示属性中的颜色质量设定为32位。  
   
  代码如下:  
  //有白框的--32位色环境  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      Image1.Transparent   :=   True;  
      ImageList1.GetBitmap(0,Image1.Picture.Bitmap);  
  end;  
   
  //没白框的--32位色环境  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      Image1.Transparent   :=   True;  
      Image1.Picture.Bitmap.LoadFromFile('cms.bmp');  
  end;  
   
  另外使用Image1.Picture.Bitmap.LoadFromResource(HInstance,'B1');即从资源调入图片也可以正常显示。  
   
  唯独在32色下   从ImageList调入有问题。其实使用其他方式也能解决,不过好奇为什么ImageList会有这个现象?跟ImageList选项设置有关吗?试过几个选项,没什么效果。  
 

你说的32色环境指的是32色图片?还是屏幕设置32位方式?  
 

你说的32色环境指的是32位图片?还是屏幕设置32位方式?

窗体的Transparent??

maozefa(阿发伯)    
  你说的32色环境指的是32色图片?还是屏幕设置32位方式?  
  =========  
  32位色环境是屏幕设置为32位颜色,屏幕显示属性,“颜色质量”设置为“最高(32位)”。听你这么一说,我忘了图片的颜色是多少位的了,好像是用windows带的画笔工具画出来后存为最高质量的.bmp文件,是不是跟这个有关系.....我再去试试,有可能啊。  
   
  qzmp_sc(你是白云~我是乌鸦)    
  窗体的Transparent??  
  =========  
  我说的不是窗体的Transparent,是在窗体上放个Image,Image的图片根据需要从ImageList中调出,让Image透明。  
 

去试了试,bmp文件只有单色、8色、256色、24位色这么几种,没有32位色的bmp,我再详细说下做法;   在form上放一个Image组件,再放一个ImageList组件,打开windows画笔,创建一个64*64的图片,用白色填充,随便画几笔红色(别画到左下角的那个点上),存为一个bmp文件,将ImageList尺寸改为64×64,调入刚做好的bmp文件。然后放个button在form上。  
  代码:  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      Image1.Transparent   :=   True;  
      ImageList1.GetBitmap(0,Image1.Picture.Bitmap);  
  end;  
  这时Image1将白色的背景和红色的图案都显示出来了——白色部分应该透明掉的。  
  此时不用改程序,到桌面,点右键选“属性”,到显示设置去选桌面的“颜色质量”,改为“中(16位)”,然后再运行这个程序,现在白色部分透明了,只显示红色的图案了。  
   
  我就是想问问:图片的透明与桌面的颜色质量设置有关么?但是另外一个例子又说明似乎无关:  
  先将桌面改回32位颜色。  
  然后将代码改为:  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      Image1.Transparent   :=   True;  
      ImageList1.Picture.Bitmap.LoadFromFile('1.bmp');     //1.bmp就是刚才我们创建的图片  
  end;  
  现在运行:可看到在32位颜色质量的桌面环境下,图片的白色部分又透明了~     我有点糊涂了,各位能指点下么?

我有点糊涂了,各位能指点下么?  
  =============================================================================  
  听你说,我倒糊涂了,我从没试过你说的情况,我的显卡一直就是32位,我运行了你的代码,能够透明显示

你是否安装了第三方类似JPEG.PAS用于打开图形文件的单元或者组件,如果是,可能与这些文件有关

maozefa(阿发伯)   (   )   信誉:110         Blog     2006-12-8   19:33:41     得分:   0      
   
  听你说,我倒糊涂了,我从没试过你说的情况,我的显卡一直就是32位,我运行了你的代码,能够透明显示  
  ================================  
  呵呵,我的机器上装了一大堆组件,现在外面出差,等回去有时间找台别的机器试试。多谢各位关注。周末愉快,加班的兄弟们辛苦啊。  
  结贴先。

转载于:https://www.cnblogs.com/delphi2007/archive/2008/08/31/1280462.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  VB6本身只支持16(4位)和256(8位)的图标,这种图标只是早期的Windows版本所采用的 图标格式标准。现在各种高清真彩32位带Alpha通道、24位不带Alpha通道)早已经很流行 并且普遍使用了,但在VB6中却不能直接支持、使用。即使想把这种真彩图标加入图标资源、 或者是把它加入ImageList控件中,也会被提示“无效图片”而不能加入。记得论坛中曾经有某 位高人说过,VB6的Form是支持真彩图标的,可以给窗体设置真彩图标。   昨天上午我试了一下,新建一个标准EXE工程,然后随意找了一个高清真彩图标文件,给工 程的Form1设置Icon属性,成功了……… 但是,感觉它显示的图标有点怪异,总觉得有些不对 劲呢…… 于是,我把这个高清图标文件中32×3216×16这两种规格的真彩图标单独提取 出来,分别保存为一个.ico格式的文件,然后再用这两个图标文件来给它设置Icon属性。果然, 这两个文件在操作时VB6都提示“无效图片”!!!这就说明:VB6是不支持真彩图标的。最 开始时“能设置成功”,只不过是因为它从图标组中找到了256的、它能支持的格式罢了。   闲话不多说了,这个模块进行了简单的封装,提供了一些基础的操作功能。源码中有比较 详细的注释,使用起来应该是很简单的,就不再写什么“应用示例代码”了。首先要调用接口 函数装载图标,从图标文件加载就调用LoadFromFile(),从字节数组加载就调用LoadData()。 加载成功后,即可调用其它接口来使用图标对象了,比如用GDI方式把图标画到窗口内、或者画 到某个PictureBox上、给自己的窗口或别的程序窗口设置一个真彩图标等。虽然在“资源” 中不能以“图标”的方式把真彩图标加入,但是,却可以按“自定义资源”的方式把图标文件 装入,使用时读取出对应的资源数据,然后调用函数LoadFromData()进行加载。加载成功就可 以使用里面的真彩图标了。   这个模块只提供了一些基本的功能,如果有需要可以自己再进行扩展。还有就是没有进行 异常处理,因此要求用来加载的文件必须是正确的图标文件、并且可以读取;数组数据则必须 是合法的图标文件数据。否则可能会引起异常,你也可以修改代码进行异常捕获处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值