请问如何得到icon的颜色是多少位的?(100分)

  • 主题发起人 主题发起人 pengyt
  • 开始时间 开始时间
兄弟啊!
你这样写mBmp.Canvas.Draw(0,0,mIcon);其实根本就没有什么效果啊!
你的转换是对的,但是你应该重新载入!
就是说你在将ICO转换为BMP以后,需要保存、加载。
mBmp.SaveToFile('....bmp');
mBmp.LoadFromFile('....bmp');

我建议你可以这样,对一个ICO,你拿到ACDSEE里去另存为BMP,你来判断这个BMP的颜色数!
完全可以!
 
首先,mBmp.Canvas.draw(0,0,mIcon)当然有效果,TIcon转TBitmap就是这样做的,
不过需要先将mBmp.Width:=mIcon.Width;mBmp.Height:=mIcon.Height;
其次,Draw了之后,mBmp.pixelFormat=pfDevice,你保存后再加载得到的结果是不定的,
但是肯定不能反映出mIcon原有的颜色深度.
第三,我需要编程实现,如果可以通过ACDSee,那直接看ICO的颜色深度就可以了也不需要
做转换了(ACDSee 4.0)
 
你说得当然有道理了;
但是ICO好像只有8色和16色的吧?

你转换为BMP,本身就改变了其颜色深度,所以利用GetPaletteEntries不可取.
 
不会吧,256色的ico肯定有,我可以发一个给你看看,
而且就算是只有16和8色也需要判断到底是多少色啊,
现在没有办法判断

 
没有人回答吗? :(
 
win32sdk:
Var IconInfo:_IconInfo;
bh: tagbitmap;
begin
fillchar(Iconinfo,Sizeof(iconinfo),0);
GetIconinfo(youricon.handle, iconinfo);
if iconinfo.hbmColor<>0 then
if Getobject(iconinfo.hbmColor,sizeof(bh),@bh) >0 then
Case bh.bmBitsPixel of
2:
4:
8:
15:
.....
End;
deleteobjet(iconinfo.hbmColor);
deleteobjet(iconinfo.hbmMask);

end;





 
GGCAT: 你好,请问youricon是TIcon吗,我用yourIcon: TIcon来
做试验,发现 bh.bmBitsPixel = 32,而这个图标是16色的,
bh.bmBitsPixel应该为 4,请问可以再解释一下吗?

 
sorry 确实不对 因为geticoninfo中的 hbmcolor 是DDB ,其色彩深度总是和系统色彩
深度相同,可以这么做:

Var ms:TmemoryStream;
Begin
ms:=Tmemorystream.create;
Try
YourIcon.savetostream(ms);
If ms.size>0 then
Case (PInteger(Dword(ms.memory)+8))^ of
2: 黑白
16: 16色
256: 256 色
65536: 高彩色
1 shl 24: 真彩色
End;
finally
ms.free
End;

End;

 
GGCAT: 你好,上面给出的方法对于 2,16色的ICO都对,但是256色的图标

(PInteger(Dword(ms.memory)+8))^ 的返回值为0,更高颜色的还没有试过

请问还有什么地方需要注意的吗?
 
谢谢GGCAT,至少可以知道图标是2,16和256及以上颜色的了. 加分了.
 
后退
顶部