ico文件的数据结构
- 格式:doc
- 大小:78.50 KB
- 文档页数:13
ico格式二进制值ICO格式是一种常用的图标文件格式,它通常用于Windows操作系统中的图标显示。
ICO文件是由一系列图像资源组成的容器,每个图像资源可以包含多个图标尺寸和颜色深度的变体。
ICO文件的二进制值由多个部分组成,下面我将从多个角度解释ICO格式的二进制值。
1. 文件头部分,ICO文件的二进制值的开始部分是文件头,它包含了一些基本的信息。
文件头的长度为6个字节,其中包括两个字节的魔数"00 00",表示这是一个ICO文件;接下来的两个字节表示图标数量,通常为1;最后的两个字节表示ICO文件的类型,一般为1。
2. 图像资源目录,ICO文件的二进制值的下一个部分是图像资源目录,它描述了ICO文件中包含的每个图像资源的信息。
每个图像资源目录项的长度为16个字节,其中包括4个字节的宽度、4个字节的高度、1个字节的颜色数(0表示多彩图标),1个字节的保留值(一般为0),2个字节的颜色平面数(一般为0或1),2个字节的位深度(一般为32),4个字节的图像数据大小和4个字节的图像数据偏移量。
3. 图像数据,ICO文件的二进制值的最后部分是图像数据,它包含了实际的图像像素信息。
每个图像资源的图像数据可以是位图(BMP)格式或PNG格式,具体格式取决于ICO文件中的图像资源。
图像数据的大小和偏移量在图像资源目录中指定。
总结起来,ICO格式的二进制值由文件头、图像资源目录和图像数据组成。
文件头部分包含了基本的ICO文件信息,图像资源目录描述了ICO文件中每个图像资源的属性,而图像数据则包含了实际的图像像素信息。
这些部分的组合构成了完整的ICO文件。
希望以上回答能够满足你的要求,如果还有其他问题,请随时提出。
IoC(控制反转)的实现原理1. 什么是IoC控制反转(Inversion of Control,简称IoC)是一种设计思想或模式,它的核心思想是将对象的创建和依赖关系的管理交给容器来完成,从而实现了对象之间的解耦。
IoC的目的是降低组件之间的耦合度,提升系统的可维护性和可测试性。
在传统的编程模式中,对象的创建和依赖关系的管理通常由程序员手动创建和维护,而在IoC容器的帮助下,这一过程被自动化地处理了。
2. IoC的基本原理IoC的实现原理主要包括两个核心概念:依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
2.1 依赖注入(DI)依赖注入是一种机制,它通过容器将一个对象的依赖关系注入到该对象中,使得对象只需要关注自身的业务逻辑,而不需要关心依赖对象的创建和管理。
通常,依赖注入可以通过构造函数注入、属性注入和方法注入来实现: - 构造函数注入:通过对象的构造函数接收依赖对象。
- 属性注入:通过对象的属性接收依赖对象。
- 方法注入:通过对象的方法接收依赖对象。
依赖注入的核心思想是:将对象之间的依赖关系从代码中解耦出来,交给容器来管理,对象只需要声明自己需要哪些依赖对象,由容器来负责注入。
2.2 依赖查找(DL)依赖查找是指通过容器查找依赖对象的过程。
当一个对象需要获取某个依赖对象时,它可以通过容器来进行查找。
容器将使用一种查找策略来查找对象并返回给请求者。
依赖查找的方式有两种:主动查找和被动查找。
- 主动查找:对象主动向容器请求依赖对象。
- 被动查找:对象被动地等待容器将依赖对象注入。
无论是哪种方式,依赖查找的核心思想是:将对象获取依赖对象的逻辑从对象中解耦出来,由容器统一管理。
2.3 IoC容器IoC容器是IoC模式的核心,它负责创建对象、管理对象和处理对象之间的依赖关系。
在Spring框架中,容器是由BeanFactory和ApplicationContext两个核心接口实现的。
ioc框架概念【原创实用版】目录1.IOC 框架的概述2.IOC 框架的核心概念3.IOC 框架的实现原理4.IOC 框架的应用实例5.IOC 框架的优缺点正文1.IOC 框架的概述IOC(Inversion of Control,控制反转)框架是一种设计模式,它主要用于解决软件系统中组件之间的依赖关系问题。
在传统的程序设计中,我们通常需要创建一个对象来完成某项功能,这就导致了代码之间的紧密耦合。
而 IOC 框架通过反转对象的创建和依赖关系,使得对象之间的耦合度降低,从而提高了代码的可复用性和可维护性。
2.IOC 框架的核心概念(1)依赖注入(Dependency Injection,DI):依赖注入是指在运行时将一个对象的依赖关系(即所需的其他对象)传递给它,从而实现对象之间的解耦。
这可以通过构造函数、属性或方法传递依赖。
(2)容器(Container):容器是 IOC 框架的核心组件,负责管理对象的创建、依赖注入以及生命周期管理。
当应用程序需要一个对象时,容器会查找该对象的配置信息,创建对象并将其依赖注入。
3.IOC 框架的实现原理IOC 框架的实现原理主要包括以下几点:(1)配置文件:IOC 框架通过配置文件来描述对象之间的依赖关系,这些配置文件可以是 XML、JSON、注解等形式。
(2)工厂模式:IOC 框架通过工厂模式创建对象,将对象的创建和依赖注入分离,降低了代码之间的耦合度。
(3)依赖注入:IOC 框架通过依赖注入将依赖关系传递给对象,使得对象之间只需要关注业务逻辑,而不需要关注彼此的创建和依赖关系。
4.IOC 框架的应用实例一个简单的 IOC 框架应用实例如下:(1)定义一个用户接口(UserInterface):```javapublic interface UserInterface {void showMessage();}```(2)实现用户接口(UserImpl):```javapublic class UserImpl implements UserInterface {private String message;public UserImpl(String message) {this.message = message;}@Overridepublic void showMessage() {System.out.println(message);}}```(3)创建一个容器(Container):```javapublic class Container {public UserInterface getUserInterface() {return new UserImpl("Hello, IOC!");}}```(4)使用容器获取用户接口并调用方法:```javapublic class Main {public static void main(String[] args) {Container container = new Container();UserInterface userInterface = container.getUserInterface();userInterface.showMessage();}}```5.IOC 框架的优缺点(1)优点:- 降低对象之间的耦合度,提高代码的可复用性和可维护性;- 提高代码的可测试性,方便单元测试;- 可以方便地更换依赖的实现,实现动态配置。
ioc实现原理IOC实现原理。
控制反转(Inversion of Control,简称IoC)是一种软件设计思想,它的核心概念是将程序的控制权从程序内部转移到外部容器中,通过依赖注入的方式实现对象之间的解耦和管理。
在实际应用中,IoC容器负责管理对象的创建、组装和生命周期,使得程序的结构更加灵活和可维护。
实现IoC的原理主要包括依赖注入、工厂模式和反射机制。
首先,依赖注入是IoC的核心概念之一。
通过依赖注入,对象的依赖关系由外部容器动态注入,而不是在对象内部直接创建依赖对象。
这样做的好处是可以实现对象之间的松耦合,提高了代码的可测试性和可维护性。
依赖注入可以通过构造函数注入、属性注入和方法注入等方式实现,其中构造函数注入是最常用的方式,通过构造函数将依赖对象传入目标对象。
其次,工厂模式也是实现IoC的重要手段之一。
工厂模式将对象的创建和组装过程封装在工厂类中,通过工厂类来创建对象,实现了对象的解耦和管理。
在IoC容器中,通常会使用工厂模式来管理对象的创建和生命周期,将对象的创建过程交给工厂类来完成,从而实现了对象的控制反转。
最后,反射机制也是实现IoC的重要技术之一。
通过反射机制,程序可以在运行时动态获取类的信息并实例化对象,从而实现了对象的动态创建和管理。
在IoC容器中,通常会使用反射机制来实现对象的动态创建和注入,通过反射机制可以实现对象的自动装配和管理。
综上所述,IoC实现的核心原理包括依赖注入、工厂模式和反射机制。
通过这些原理的应用,可以实现对象之间的解耦和管理,提高程序的灵活性和可维护性。
在实际应用中,IoC容器可以通过配置文件或注解的方式来管理对象的创建和组装,从而实现了程序的控制反转。
通过理解和掌握IoC的实现原理,可以更好地应用IoC容器来提高程序的质量和可维护性。
浅谈IOC--说清楚IOC是什么博文目录1.IOC的理论背景2.什么是IOC3.IOC也叫依赖注入(DI)4.IOC的优缺点5.IOC容器的技术剖析6.IOC容器的一些产品7.参考博文本文旨在用语言(非代码)说清楚IOC到底是什么,没有什么高深的技术,园中的老牛、大虾们看到这里可以绕行了,以免浪费您宝贵的时间。
IOC这个东西DebugLZQ早就想写了,但是出于对文章权威性的考虑(不能误人子弟- -!),本文主要内容来源于最近LZ看的一些国内外的关于IOC的博文、博问,所有引用到的文章,在参考博文中均已注明。
1.IOC的理论背景我们知道在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统地业务逻辑[1]。
图1 软件系统中耦合的对象如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。
图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务。
我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。
齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。
对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。
现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。
对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。
图2 对象之间的依赖关系耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。
如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。
为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson 1996年提出了IOC理论,用来实现对象之间的“解耦”,目前这个理论已经被成功地应用到实践当中。
ico化学术语-概述说明以及解释1.引言1.1 概述概述化学术语在化学领域中扮演着非常重要的角色,它们帮助我们准确地描述和表达化学现象、化学反应和化合物的特性。
在化学领域中,有许多常见的术语被广泛使用,其中之一就是ico化学术语。
ico化学术语是指一类以“i”、“c”和“o”三个字母开始的化学术语,如icohydrides、icosahedra、icosanoids等。
这些术语通常用于描述分子的形状、结构和性质。
ico化学术语的命名方式源自于希腊字母,其中“i”代表一个多面体的面数,例如i在化合物中表示20个面。
接下来的“c”代表一个多面体的顶点数,例如c表示12个顶点。
而最后的“o”则代表一个多面体的边数,例如o在化学术语中表示30条边。
通过这种命名方式,我们可以大致了解到一个化合物的分子结构,以及它的形状特征。
ico化学术语在化学领域中具有广泛的应用。
例如,在配位化学中,我们可以通过ico化学术语来描述配合物中金属离子的配位数和形状。
在材料科学中,ico化学术语也被用于描述各种纳米材料的晶体结构和形态。
由于ico化学术语的简洁性和准确性,它们被广泛接受并使用于科学界。
本文将介绍一些常见的ico化学术语,并探讨它们在化学研究中的应用。
通过了解这些术语的含义和用途,读者们将能更好地理解与化学相关的文献和研究成果。
通过对ico化学术语的深入研究,我们可以进一步拓展化学领域的知识,并为未来的科学研究提供更多的可能性。
本文将会按照以下结构进行介绍和讨论。
1.2 文章结构文章结构部分的内容可以按照以下方式编写:2. 文章结构在本篇长文中,将对ico化学术语进行全面的介绍和解释。
本文的结构安排如下:2.1 ico化学术语1- 在这一部分,将详细介绍第一个ico化学术语,包括其定义、相关的理论知识以及实际应用等方面的内容。
2.2 ico化学术语2- 接下来,将深入探讨第二个ico化学术语,提供它的定义、背后的原理和重要性,以及它在化学领域中的应用案例。
ico的简单的理解ICO的简单理解ICO是Initial Coin Offering的缩写,即首次代币发行。
它是一种通过发行代币来筹集资金的方式,类似于股票市场中的IPO (Initial Public Offering)。
ICO在近几年逐渐兴起,并成为了一种热门的融资方式。
在ICO中,发行方通过发行自己的代币来吸引投资者购买。
这些代币通常基于区块链技术,可以用来购买发行方的产品或服务,或者在未来进行交易。
投资者在购买代币时,通常会使用比特币、以太坊等加密货币进行支付。
ICO的优势之一是为初创企业提供了一种高效、低成本的融资方式。
相比传统的融资方式,如银行贷款或风险投资,ICO无需经过繁琐的审批流程,可以更快地获得资金支持。
此外,ICO还为投资者提供了参与项目发展的机会,一旦项目成功,投资者的代币价值可能会大幅增长。
然而,ICO也存在一些风险和挑战。
首先,由于缺乏监管,ICO市场存在较高的风险。
一些不法分子可能会利用ICO进行欺诈活动,投资者需要谨慎选择项目,避免遭受损失。
其次,由于市场竞争激烈,有许多项目很难获得足够的关注和资金支持。
因此,项目方需要具备创新性和竞争力,才能在ICO市场中脱颖而出。
为了解决ICO市场的问题,一些国家和地区开始加强对ICO的监管。
他们要求ICO项目方遵守相关法律法规,并对投资者进行风险提示。
这种监管的出现有助于保护投资者的权益,提高市场的透明度和稳定性。
总结起来,ICO是一种通过发行代币来筹集资金的方式。
它为初创企业提供了一种高效、低成本的融资方式,同时也为投资者提供了参与项目发展的机会。
然而,ICO市场存在一定的风险和挑战,投资者需要谨慎选择项目。
随着监管的加强,ICO市场将更加规范和健康发展。
什么是ICO?深度聊聊ICO这件事这是我11月18日在“一块听听”公众号中进行分享的内容,令人意外的是,竟然有800多位听众来听我的分享,想象一下,如果是700多人在一个会场,应该是多大的的场面,幸亏是通过网络,才不需要这么劳师动众。
感谢互联网,给了我们如此简单的互动交流的机会。
ICO的含义ICO按照英文字面意思来解释(Initial Coin Offerings),是一种用加密货币投资早期项目的方式从字面意思来看,分别是:初始、虚拟币、产品是指的用虚拟币去投资的早期产品或者项目的行为。
使用的虚拟币,有可能是比特币,也有可能是ETH 以太坊,另外还有一些项目接受更多的品种的虚拟币。
投资完成后,项目方一般会按比例给投资者发放代币,多数情况下代币是可以在这个项目中使用的或者分红权益,少数的情况是直接给的项目股份,通常情况下,代币会随着项目的发展其价值会有相关性的变化,有的项目会发展的很好,投资者获得了巨大的收益,而有的项目,却会由于种种原因没有发展起来,那ICO 参与者有可能就什么都得不到,即使是得到代币,也有可能因为代币归零而损失巨大。
参与ICO 获得的代币,有的可以通过二级市场交易获得升值回报,有的可以通过得到分红获得回报。
并不是所有的ICO 项目ICO 结束后都会得到平台的交易支持,有些项目已经ICO 完成几年了,都没有得到平台的交易支持,以至于尽管参与者账面有资产,却只能通过场外交易变现,甚至根本无法变现。
ICO 与现实世界中对标的是IPO (Initial Public Offerings)首次公开募股,后面我会专门讲ICO 和IPO 的区别。
ICO的历史首个明文记载的ICO项目时间是2013年6月,万事达币(MSC)在Bitcointalk 论坛上发起了众筹。
万事达币是建立在比特币区块链上的一种传输协议,能够提供比特币协议层不能提供的功能,当时共募集了5000多个比特,令人唏嘘不已的是,这个ICO 的项目至今没有代币上线交易,项目应该是失败了。
对IOC的理解一、什么是IOC1.1 控制反转的概念控制反转(Inversion of Control,简称IOC)是一种软件设计原则,它将程序的控制权从应用程序代码中转移给了外部的容器。
在传统的编程模型中,应用程序代码负责管理和控制对象的创建、依赖和生命周期,导致代码之间紧密耦合,可维护性差。
而通过IOC,对象的创建和依赖交由外部容器负责,应用程序代码只需声明对象的依赖关系,可以更加灵活、高内聚低耦合地组织代码。
1.2 IOC的优点和作用•解耦–通过IOC容器管理对象的创建和依赖,减少代码之间的依赖关系,降低耦合性。
•可测试性–通过IOC容器可以轻松替换依赖的对象,方便进行单元测试和集成测试。
•高内聚低耦合–通过IOC容器实现代码的解耦,使得代码更加模块化、可维护性更好。
二、IOC的实现方式2.1 依赖注入(Dependency Injection,简称DI)依赖注入是IOC的一种常见实现方式,它通过构造函数注入、属性注入或接口注入等方式,将对象的依赖关系注入到目标对象中。
2.1.1 构造函数注入在构造函数注入中,依赖的对象通过对象的构造函数进行注入。
例如:public class UserServiceImpl {private UserDao userDao;public UserServiceImpl(UserDao userDao) {erDao = userDao;}}2.1.2 属性注入在属性注入中,依赖的对象通过对象的属性进行注入。
例如:public class UserServiceImpl {@Autowiredprivate UserDao userDao;}2.1.3 接口注入在接口注入中,依赖的对象通过实现接口的方式进行注入。
例如:public interface UserRepository {// ...}public class UserRepositoryImpl implements UserRepository {// ...}public class UserServiceImpl implements UserService {private UserRepository userRepository;@Autowiredpublic void setUserRepository(UserRepository userRepository) {erRepository = userRepository;}}2.2 依赖查找(Dependency Lookup)依赖查找是IOC的另一种实现方式,它通过在IOC容器中查找依赖的对象来进行注入。
ioc实现原理IOC实现原理。
控制反转(Inversion of Control,简称IOC)是一种软件设计思想,它将控制权从应用程序代码中转移出来,交由一个外部容器来管理对象之间的依赖关系。
在传统的应用程序设计中,对象的创建和依赖关系的管理通常由程序员手动编写代码来实现,而在IOC容器中,这些工作都由容器来完成,程序员只需要通过配置文件或注解的方式来描述对象之间的依赖关系,而无需关心对象的创建和管理。
IOC容器通过依赖注入(Dependency Injection)的方式来实现对象之间的依赖关系。
依赖注入是指在创建对象时,将其所依赖的其他对象注入到目标对象中,从而实现对象之间的解耦。
通过依赖注入,对象的创建和依赖关系的管理被统一交由IOC容器来处理,使得系统更加灵活、可扩展和易于维护。
IOC容器的实现原理主要包括以下几个方面:1. 反射机制。
IOC容器通常使用反射机制来动态创建对象。
反射机制是指程序在运行时可以获取对象的类型信息,并可以动态调用对象的方法、访问对象的属性等。
通过反射机制,IOC容器可以根据配置文件或注解中描述的对象类型来动态创建对象,从而实现对象的解耦和动态管理。
2. 配置文件。
在IOC容器中,通常会使用配置文件来描述对象之间的依赖关系。
配置文件可以是XML文件、JSON文件或属性文件等,其中包含了对象的类型、属性值、依赖关系等信息。
IOC容器在启动时会读取配置文件中的信息,根据配置文件中的描述来创建对象并管理对象之间的依赖关系。
3. 注解。
除了配置文件外,IOC容器还可以使用注解的方式来描述对象之间的依赖关系。
通过在类、属性或方法上添加特定的注解,程序员可以告诉IOC容器如何创建对象、如何注入依赖等信息。
IOC容器在启动时会扫描程序中的注解信息,根据注解描述来创建对象并管理对象之间的依赖关系。
4. 生命周期管理。
IOC容器通常会管理对象的生命周期,包括对象的创建、初始化、销毁等过程。
1.制造原理调色板模式的ico文件的数据结构,可分为 6 部分:1.ICON文件头(6字节)2.ICON图象信息块(16字节)3.BMP信息头(40字节)4.调色板(16色为64字节,256色为1024字节)5.XOR位图6.AND位图而调色板模式的bmp文件的数据结构可分为 4 部分:1.BMP文件头(14字节)2.BMP信息头(40字节)3.调色板(16色为64字节,256色为1024字节)4.XOR位图分析可知,ico图标与bmp位图有三个相同的部分(注:真彩图标与真彩位图的数据结构均没有调色板部分,所以是两个相同的部分),而且这三个部分是最重要的部分。
因此,我们只要去掉 bmp位图的 BMP文件头,再加上ICON文件头、ICON图象信息块和AND位图,就可以轻松制作出255×255象素以内的任何规格的图标了。
然而……且慢,有一点却是很不轻松的:如果你想制作背景透明(屏蔽背景色)的图标,那么你还需要对 XOR位图的数据动大手术,更不轻松的是,AND 位图的数据也必须符合相应的要求,这是相当困难的;而制作有背景色的图标的话,XOR 位图部分我们可以原封不动,AND 位图全是 0,只要计算出它的长度来即可添加到 XOR位图数据的后面,这是很容易实现的。
所以,下面我所讲的,都是制作有背景色的图标。
ICON文件头结构很简单,一共只有3个数据共6个字节,我们要给其中的“资源类型”和“图象个数” 2个数据均赋值为 1。
ICON 图象信息块有 7个数据共16字节,有5个数据要赋值:图标宽度、图标高度、颜色计数、图像数据块的长度、图象数据块相对于文件头部的偏移量。
要赋值的 5个数据中,图象数据块相对于文件头部的偏移量是固定的,图像数据块的长度需要计算,其余 3个数据可从 BMP 信息头中获得资料。
AND 位图的长度必须根据从 BMP 信息头中获得的有关数据计算。
此外,还要更改 BMP 信息头中的 2个数据:一个是图象长度数据(要加上 AND 位图的长度),另一个是图像高度数据(这只要简单地将原数据×2即可)。
OK,一切都准备好了,万事俱备,只欠东风,下面就让东风劲吹吧。
2.编程新建一个窗体,添加一个公用对话框,两个图片框,三个按纽。
窗体与图片框的ScaleMode属性均设为3,其中 Picture1 的 Autosize 属性设为 Ture。
按纽的属性设置:Command1:Caption=打开图片Command2:Caption=数据处理,Enabled=FalseCommand3:Caption=保存图标,Enabled=False代码如下:Option ExplicitDim pDAT() As Byte '源图数据Dim aDAT() As Byte 'AND位图数据Dim iDAT() As Byte 'icon文件头和图象信息块数据Private Sub Command2_Click()On Error GoTo 100Dim d As Long, c As LongDim aLength As Long 'AND位图长度aLength = 4 * (pDAT(4) \ 32 + Abs((pDAT(4) Mod 32) > 0)) * pDAT(8) '计算AND位图的长度ReDim aDAT(aLength - 1) As ByteReDim iDAT(21) As Byte'给 icon文件头和 icon图象信息块的元素赋值iDAT(2) = 1 '资源类型iDAT(4) = 1 '图像个数iDAT(6) = pDAT(4) '图像宽iDAT(7) = pDAT(8) '图像高iDAT(8) = 16 * Abs(pDAT(14) = 4)iDAT(18) = 22 '图象数据块相对于文件头部的偏移量'更改BMP信息头中的图像高度数据d = 2 * pDAT(8)Select Case Len(Hex(d))Case 1, 2: pDAT(8) = dCase 3, 4: pDAT(9) = d \ 256: pDAT(8) = d And 255End Select'更改BMP信息头中的图象长度数据c = pDAT(21):d = pDAT(20) + c * 256 + pDAT(22) * 65536 + aLengthSelect Case Len(Hex(d))Case 1, 2: pDAT(20) = dCase 3, 4: pDAT(21) = d \ 256: pDAT(20) = d And 255Case 5, 6: c = d And 65535: pDAT(22) = d \ 65536: pDAT(21) = c \ 256: pDAT(20) = c And 255 End Select'计算icon图像信息块中的图象长度数据Select Case pDAT(14) 'pDAT(14)=4为16色,=8为256色,=24为真彩Case 4: d = d + 40 + 64 '64是16色调色板长度,40是BMP信息头的长度Case 8: d = d + 40 + 1024 '1024是256色调色板长度Case 24: d = d + 40End SelectSelect Case Len(Hex(d))Case 1, 2: iDAT(14) = dCase 3, 4: iDAT(15) = d \ 256: iDAT(14) = d And 255Case 5, 6: c = d And 65535: iDAT(16) = d \ 65536: iDAT(15) = c \ 256: iDAT(14) = c And 255 End SelectCommand3.Enabled = True: Command2.Enabled = False100End SubPrivate Sub Command1_Click()On Error GoTo ReadErrDim ImageName As String, fLength As Long, BJ As BooleanWith CommonDialog1.DialogTitle = "打开".Filter = "图片文件(*.bmp,*.jpg,*.gif)|*.bmp;*.jpg;*.gif".ShowOpenIf Len(.FileName) < 5 Then Exit SubImageName = .FileNameEnd WithPicture1.Picture = LoadPicture(ImageName)Picture2.Width = Picture1.Width: Picture2.Height = Picture1.HeightPicture2.Picture = LoadPicture()If Right(LCase(ImageName), 3) <> "bmp" Then '如果不是位图,先存为位图,再读取BJ = TrueImageName = App.Path & "\TempFile.bmp"SavePicture Picture1.Image, ImageNameEnd IffLength = FileLen(ImageName) '获取文件长度ReDim pDAT(fLength - 15) As ByteOpen ImageName For Binary As #1Get #1, 15, pDATCloseIf BJ Then Kill ImageName '删除临时位图文件If (pDAT(5) + pDAT(6) + pDAT(7) + pDAT(9) + pDAT(10) + pDAT(11) > 0) ThenMsgBox "图片尺寸超出"Exit SubEnd IfMe.Caption = ImageNameCommand2.Enabled = TrueExit SubReadErr:CloseEnd SubPrivate Sub Command3_Click()On Error GoTo WriteErrDim IconName As StringWith CommonDialog1.Flags = &H802.DialogTitle = "保存".Filter = "图标文件(*.ico)|*.ico".ShowSaveIf .FileName = "" Then Exit SubIconName = .FileNameEnd WithOpen IconName For Binary As #1Put #1, , iDATPut #1, , pDATPut #1, , aDATCloseReDim iDAT(0)ReDim pDAT(0)ReDim aDAT(0)Command3.Enabled = FalsePicture2.Picture = LoadPicture(IconName)Exit SubWriteErr:CloseMsgBox "图标制作失败"End Sub3.代码分析①在 Command1_Click 过程中,使用二进制读入数据方法,从第15字节读起,这样就去掉了BMP文件头。
②在 Command3_Click 过程中,使用二进制写入数据方法,将ICON文件头、ICON图象信息块、读入的位图数据(修改了其中几个字节的数据)、AND位图数据(全0数据)等,依次写入一个ico文件③Command2_Click 过程是本代码关键的关键。
首先计算 AND位图的长度。
这就需要知道扫描线的长度和图象的高度,而计算扫描线长度还需知道图像的宽度。
本代码中,图像高度在原位图数据的 pDAT(8)元素中,图象宽度在原位图数据的 pDAT(4) 元素中,所以可归纳成代码中所示的计算公式。
接着给 ICON文件头和 ICON图象信息块的元素赋值。
请注意 iDAT(6)和 iDAT(7),它们分别是图标的宽度和高度,由于它们都只占用 1个字节,故图标规格的最大值只能做到 255 象素(如果它们都分别占用 4 个字节的话,呵呵,那制作出来的图标是多么地惊人啊!)。