保存为 ico 格式
来源:互联网 发布:苹果软件无法下载 编辑:程序博客网 时间:2024/04/28 11:08
几天前 yrt888 就提出了这个问题,今天看到行者的 blog 中用 Ole... 类 api 来保存为 ico 的方法,同时也看到有人留言说只能保存为 16 色的图标,试了一下,确实如此。要将其他格式的图片保存为 24bits 甚至 xp 格式的 32bits 图标,是否真的就那样难呢?到网上查了查,说 ico 文件格式的资料确实不少,可保存为 ico 格式却没几个,唯一一个可用的又是用 c# 写的,且用到了 .NET 中类,这样 vfp 就难以借用这种方法了。但细致研究了一下 ico 文件的格式后发现,其实 ico 格式基本上只是在 bmp 格式的外面加了一层壳,后面再附上一个掩码,如果做成只包含一个图标的 32bits 图标文件也并非太难,所以有了下面的实验品,不过简化了很多处理,比如掩码处理被省略了,这对图标的显示没有影响,只是如果你把它放到桌面上,然后拖动它就会发现有些问题了,不过这不重要,有必要的话再研究一下掩码的自动生成方法就可以了。
运行后,会首先要你指定一个用于转换的原图片文件,这里缺省使用 png 类型的图片,因为通常只有这种图片才会带有 Alpha 通道,不过现在有些 bmp 图片也有 32bits 格式的,当然你也可以选其他类型图片来作原料,不过就很难保证会透明了,gif 如果原来有透明处理也可以,但 jpg 等格式就肯定不会透明;之后再指定要保存的位置和图标文件名即可。
这里缺省保存为 32x32 大小的图标,你可以修改 ICON_SIZE 这个常数,也可以改成一个函数,将 icon_size 作为参数传入;此外,为了简单一点,这里使用了 gdiplus 中的 api 来缩放到指定大小的图片,然后再转成 ico 格式,由于 gdiplus 中缩放方法处理比较简单,所以缩放后的质量并不是很好,如果你对这个很在意,可以参照行者 blog 中的方法来自己处理缩放。
- #define ICON_SIZE 32 && 最后要保存的图标尺寸
- declare long GdiplusStartup in gdiplus long @, string, long @
- declare long GdiplusShutdown in gdiplus long
- declare long GdipLoadImageFromFile in gdiplus string, long @
- declare long GdipSaveImageToFile in gdiplus long, string, string, long
- declare long GdipDisposeImage in gdiplus long
- declare long GdipGetImageThumbnail in gdiplus long, long, long, long @, long, long
- store 0 to hToken, nImage, nImage1
- nInputBuf = 0h01 + replicate(chr(0), 15)
- cEncoder = 0h00F47C55041AD3119A730000F81EF32E
- GdiplusStartup(@ hToken, nInputBuf, 0)
- GdipLoadImageFromFile(strconv(getfile('png')+chr(0),5), @ nImage)
- GdipGetImageThumbnail(nImage, ICON_SIZE, ICON_SIZE, @ nImage1, 0, 0)
- GdipDisposeImage(nImage)
- cBmpFile = putfile('', '', 'ico')
- GdipSaveImageToFile(nImage1, strconv(cBmpFile,5)+chr(0), cEncoder, 0)
- GdipDisposeImage(nImage1)
- GdiplusShutdown(hToken)
- cBmpDat = filetostr(cBmpFile)
- erase (cBmpFile)
- nMaskSize = ICON_SIZE * bitand((ICON_SIZE + 31), 0xFFFFFFE0) / 8
- nIconDatSize = 4 * ICON_SIZE * ICON_SIZE + nMaskSize
- cIconHead = '' ;
- + bintoc(0, '2rs') ; && 保留位
- + bintoc(1, '2rs') + bintoc(1, '2rs') ; && id, 图标数
- + bintoc(ICON_SIZE, '1rs') + bintoc(ICON_SIZE, '1rs') ; && 宽, 高
- + bintoc(0, '1rs') + bintoc(0, '1rs') ; && 颜色数, 保留位
- + bintoc(1, '2rs') + bintoc(32, '2rs') ; && 位面数, 色深
- + bintoc(len(cBmpDat) - 14 + nMaskSize, 'rs') && 图标数据尺寸
- cIconHead = cIconHead ;
- + bintoc(len(cIconHead)+4, 'rs' )
- cBmpHead = '' ; && bmp 头结构大小
- + bintoc(ICON_SIZE, 'rs') + bintoc(2*ICON_SIZE, 'rs') ; && 宽, 高
- + bintoc(1, '2rs') + bintoc(32, '2rs') ; && 位面, 色深
- + bintoc(0, 'rs') ; && 压缩
- + bintoc(nIconDatSize, 'rs') ; && 图像数据尺寸
- + bintoc(0, 'rs') + bintoc(0, 'rs') ; && x, y, 分辨率
- + bintoc(0, 'rs') + bintoc(0, 'rs') && 颜色数, 关键色数
- cBmpHead = ;
- bintoc(len(cBmpHead)+4, 'rs') + cBmpHead
- cIconDat = cIconHead + cBmpHead ;
- + substr(cBmpDat, 55 ) ; && 位图数据
- + replicate( chr(0xff), nMaskSize ) && 掩码
- strtofile(cIconDat, cBmpFile)
- return
...
- 保存为 ico 格式
- 让PS可以保存为ICO格式
- HICON 保存为.ICO
- 已知HICON,如何将其保存为图标文件?以及ICO文件的格式
- 已知HICON,如何将其保存为图标文件?以及ICO文件的格式
- 已知HICON,如何将其保存为图标文件?以及ICO文件的格式
- 已知HICON,如何将其保存为图标文件?以及ICO文件的格式
- 已知HICON,如何将其保存为图标文件?以及ICO文件的格式
- 保存ico
- 利用PS将文件转换为ICO格式
- 【PHP】PHP转换图片为ico格式源码
- actionscript3保存为jpg格式
- HBITMAP 保存为JPG格式
- 保存文本文件为Unicode格式
- PCM格式保存为wav
- 保存图片为svg格式
- 保存文件为utf8格式。
- 查看ico格式图片
- 用 VS2008 Feature Pack 修改现有的 Visual C++ 程序界面
- Data truncation: Data truncated for column/Data too long for column问题解决
- 人生的意义是什么?
- BCGControlBar 的使用方法
- 转载一篇云计算会议笔记
- 保存为 ico 格式
- 程序员和妓女
- 三亚之旅---公干纪实
- 5个海盗分100颗宝石/金币的2个版本-Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题
- 在Linux下用wine安装QQ
- 如何在Ubuntu設定1280 x 768解析度?
- ubuntu装后的常用软件的安装与配置
- Ubuntu下Zend Studio中文显示问题
- Ubuntu 在笔记本上安装声卡。