能否由hIcon直接保存为图标文件?(欢迎讨论,来者有分)

firechun 2004-09-06 05:41:40
hIcon是指向图标的句柄,而句柄本身又是一个指向指针的指针,实际上如果我能通过hIcon获得图标在内存中的数据块,我想就可以实现我的目的,但如何通过一个句柄来获得内存中的数据呢?这个我搞不懂。

另外,我也想过其它方法,比如用GetIconInfo获得图标的hbmpMask和hbmpColor,再用GetDibits获得这两个位图的bits,加上图标的文件头也可以生成图标文件的数据,但无论图标是16色、256色还是真彩,hbmpColor返回的位图数据都变成32位色了,这时得到的位图bits也不对,而且对16色、256色图标,如何获得它的调色板呢?

把hIcon转换成Picture再保存,VB的SavePicture似乎只能保存16色位图,保存256色以上的图标的结果就是颜色数不对,这个方法也不行。

头痛死了,这个问题困扰我好长时间,各位来帮我想想办法。
...全文
595 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2004-09-09
  • 打赏
  • 举报
回复
呵呵,解决了就好
firechun 2004-09-09
  • 打赏
  • 举报
回复
还是自己解决了。

不过美中不足的是,无论多少色的图标,最后都是保存为真彩色,而不能保存为hIcon本来的格式。

多谢论坛里热心的朋友。困扰多日的问题搞定,痛快,再开个贴子散分。
horsefly 2004-09-08
  • 打赏
  • 举报
回复
up
horsefly 2004-09-08
  • 打赏
  • 举报
回复
up
horsefly 2004-09-08
  • 打赏
  • 举报
回复
up
rainstormmaster 2004-09-07
  • 打赏
  • 举报
回复
http://www.vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Reading_and_Saving_ICO_Files_in_VB/cFileIcon_Class_and_Demonstration_Project.zip
rainstormmaster 2004-09-07
  • 打赏
  • 举报
回复
picturebox也可以直接保存ico文件呀,你参考一下这个:
http://www.china-askpro.com/msg7/qa48.shtml
shanlisong 2004-09-07
  • 打赏
  • 举报
回复
UP
smzh8 2004-09-07
  • 打赏
  • 举报
回复
要代码E-Mail:kvsmzh@citiz.net
rainstormmaster 2004-09-07
  • 打赏
  • 举报
回复
看看http://www.moon-soft.com/doc/readelite608749.htm里对调色板处理的代码是否对你有帮助
firechun 2004-09-07
  • 打赏
  • 举报
回复
要想操作ICO文件首先得对bmp了解,ico实际上就是一个bmp文件加上ico文件头,然后再加上mark后的图像(2色,黑与白)的bmp
----------------------------------------------------------------
ico文件格式我了解
firechun 2004-09-07
  • 打赏
  • 举报
回复
按错键,没写完就提交了。


把hIcon指向的内存地址的数据用数组读入,然后写出成ICO行不行?
-----------------------------------------------------------
我就是想做到这点,但hicon是句柄,它并不是直接指向内存数据的指针,其实我的问题也可以归纳为:如何通过句柄获得内存数据。

我的问题可能比较怪,一个EXE文件,可以用loadlibary,loadresource这些API函数来获得其中包含的图标,也可以用shgetfileinfo来获得这个EXE文件的显示图标的hicon,前者没问题,后者把hicon显示到界面上也没问题,但现在我需要把后者保存为图标。

suntt 2004-09-07
  • 打赏
  • 举报
回复
实际上微软的MSDN已经给了我们一个很好的exe,dll提取ico的工具(附源程序)
firechun 2004-09-07
  • 打赏
  • 举报
回复
了解 ico 的格式,到内存中直接读出来
--------------------------------------
等于没说,我就是想把数据从内存中读出来,怎么读?


这里有一个例子:
http://vbaccelerator.com/codelib/gfx/iconread.htm
源码:
http://vbaccelerator.com/codelib/gfx/cfileico.zip
---------------------------------------------------

贴错了,这个代码:

http://www.applevb.com/sourcecode/exticontree.zip

从DLL、EXE文件中读取图标ID并保存到文件的方法。
---------------------------------------------------
谢谢,从文件中读取图标我自己也写出来了,我需要从hIcon中获得图标数据。比如说我获得一个系统图标的hicon,要把这个hicon直接保存为ico文件。


把hIcon指向的内存地址的数据用数组读入,然后写出成ICO行不行?
-----------------------------------------------------------
suntt 2004-09-07
  • 打赏
  • 举报
回复
要想操作ICO文件首先得对bmp了解,ico实际上就是一个bmp文件加上ico文件头,然后再加上mark后的图像(2色,黑与白)的bmp
chenabian 2004-09-07
  • 打赏
  • 举报
回复
强烈up
BlueBeer 2004-09-07
  • 打赏
  • 举报
回复
学习
firechun 2004-09-07
  • 打赏
  • 举报
回复
picturebox也可以直接保存ico文件呀,你参考一下这个:
http://www.china-askpro.com/msg7/qa48.shtml
---------------------------------------------------
savepicture直能保存16色图标。

http://www.vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Reading_and_Saving_ICO_Files_in_VB/cFileIcon_Class_and_Demonstration_Project.zip
-------------------------------------------------------------------
上面有人贴出来了,我看过,是从EXE、DLL文件中提取图标,这个我已经完成了。

我是想直接通过hIcon保存为图标。

可能我表达的不清楚,我不是要从文件中提取图标。

这样说吧,我们知道windows本身有个系统图标集,用SHGetFileInfo ,将uFlag参数设为SHGFI_SYSICONINDEX 就可以获得这个图标集的himl,从而获得系统图标的hIcon,怎样把这个hIcon保存为图标文件?
觉得我还没说清楚的话,看看我的代码:

Private Sub Command1_Click()
Dim himl As Long
Dim hIcon As Long
Dim hPic As IPictureDisp
Dim lngCount As Long
Dim lngX As Long

himl = GetSysILHandle(0) '获得系统大图标集的句柄
hIcon = ImageList_GetIcon(himl, 1, 0) '获得系统图标集中索引为1的图标句柄
Set hPic = IconToPicture(hIcon) '将图标句柄转换成Picture
SavePicture "d:\1.ico",hPic
End Sub

在上面的代码中,如果图标是16色的,用SavePicture保存没有问题,超过16色的,则SavePicture也只保存为16色图标,这显然不行。

再看这段代码:
Dim hIcon As Long
Dim tif As ICONINFO
Dim tBMP As BITMAP

Call GetIconInfo(hIcon,tif) '获得图标信息,GetIconInfo是API函数
MyGetObject tif.hbmColor, Len(tBMP), tBMP 'MyGetObject是API函数 GetObject

这里我本来想获得图标的彩色位图部分和黑白位图部分的bits,然后加上图标的文件头,就可以生成图标文件,但事与愿违,无论图标是多少色的,tBMP.bmBitsPixel 都是32,也就是32位色的位图,根本就不对,我不知道错在哪里。而且对256色以下的图标,还需要获得调色板,我也不知道怎么得到。所以这个方法也失败了。

再说明一下,ICO文件格式我非常清楚,从文件中提取图标的方法我也完全清楚,我要的是直接将hIcon保存为图标文件。
helanshan 2004-09-06
  • 打赏
  • 举报
回复
up
DemonLoveLizzy 2004-09-06
  • 打赏
  • 举报
回复
确实是那样的。很久以前写的提取图标保存,存下来的都是一个摸样。不过在当时,对自己要求很低。能写出来就高呼万岁,那些东西根本没在意。研究研究去。
把hIcon指向的内存地址的数据用数组读入,然后写出成ICO行不行?
加载更多回复(7)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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