当前位置:七道奇文章资讯编程技术Delphi编程
日期:2011-03-20 18:14:00  来源:本站整理

<b>用Delphi实现24位真彩色图标</b>[Delphi编程]

赞助商链接



  本文“<b>用Delphi实现24位真彩色图标</b>[Delphi编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
  摘 要 本文具体介绍了ICO文件的格局,以及操纵Jpeg、BMP等格局的24位真彩色图片,生成图标的一种办法.

  关键词 图标,位图,24位真彩色

  引言

  Delphi是目前遍及利用的可视化开辟工具,它自身带有一个图片、图标的编辑器——Image Editor,但是到Delphi7为止,都不能举行真彩图标的编辑,可以说是一个遗憾.笔者通过对图标文件的研究,实现了产生24位真彩色图标.

  图标文件的格局

  首先,解析一个具体的图标 .在CS1.6中有一个图标game.ico( ),假如用WinHex等可以举行16进制编辑的软件翻开这个图标文件,我们可以看到以下数据:

00 00 01 00 04 00 10 10 00 00 00 00 00 00 68 05
00 00 46 00 00 00 10 10 00 00 00 00 00 00 68 03
00 00 AE 05 00 00 20 20 00 00 00 00 00 00 A8 08
00 00 16 09 00 00 20 20 00 00 00 00 00 00 A8 0C
00 00 BE 11 00 00 28 00 00 00 10 00 00 00 20 00
00 00 01 00 08 00 00 00 00 00 40 01 00 00 47 46
6C 65 6D 69 6E 67 00 01 00 00 00 00 00 00 00 00

  下面我们就说一说,这些数据的具体含义.一个图标文件(*.ICO),实际上可以含有多个图标.普通,每个图标城市被转换为针对特定显示设备的图标图象.图标文件由文件头和数据构成, ICO文件一开始,是一个叫做tagIconDir的记录型的构造,在Delphi中这样来描写(括号内的数值,是针对CS图标的具体数据):

tagIconDir = packed record
idReserved:WORD;// 保存域,目前始终为 0(开始的数据$00 00)
idType:WORD; //定义为资源范例,图标值为 $0001、光标是$0002($0001)
idCount:WORD; //idCount 表示的是这个文件里包含了几个图标($0004)
idEntries:array[0..0] of tagIconDirEntry; //不包含本数组,以上一共6个字节
end;

  这个记录中的idEntries 是个数组构造,这个构造的大小不是始终为 1 的一个数组,它需求按照图标数目 ( idCount ) 来肯定真实的数组大小.它的范例为tagIconDirEntry记录,定义以下:

tagIconDirEntry = packed record
bWidth:BYTE;// 图标图片的显示宽度,以像素为单位,最大值为255 ($10=16D)
bHeight:BYTE;// 图标图片的显示高度,以像素为单位,最大值为255 ($10=16D)
bColorCount:BYTE;// 图标图片的颜色数($00)
bReserved:BYTE;// 保存域老是 0 ($00)
wPlanes:WORD;// 图标图片的位面数 ($00 00)
wBitCount:WORD;// 图标图片的颜色深度($00 00)
dwBytesInRes:DWORD;// 图标图片占用的数据量($00000568)
dwImageOffset:DWORD; // 图标图片的开始位置 ($00000046)
end;.// 这个构造是16个字节

  上面说的idCount 表示图标文件里包含的图标个数,每个图标都要有一个tagIconDirEntry构造来表示图标的具体信息.按照本构造的dwBytesInRes和dwImageOffset我们便可以肯定图片(图标)的位置了.在该位置的数据是一个称为agIconImage的记录,它是这样定义的:

tagIconImage = packed record
icHeader:TBitmapInfoHeader; //BMP文件的信息头
icColors:array[0..0]of TRGBQuad;
icXOR:array[0..0]of BYTE;
icAND:array[0..0]of BYTE;
end;

  从这个定义中我们可以看出,这个内容就是一个尺度的位图格局,只不过量了两项,icXOR和icAND,普通的位图信息里是没有这2 个成员的.大家知道,图标在被显示时,是操纵遮罩办法将 2 副位图在同一个位置显示才产生肆意表面的,先利用 XOR 位 图抠出需求显示的区域,然后再在抠出的区域中显示出需求显示的图形.由于这个来由,图标的位图格局中的位图信息头 ( TBitmapInfoHeader ) 是 2 个位图共用 的.它与普通位图头信息最大的差别是 TBitmapInfoHeader.biHeight 成员,明显它是 2 副位图高度的总和.讲到这里,我们需求对位图(BMP)文件的格局有些理解了.

  位图文件的格局

  BMP文件由文件头、位图信息头、颜色信息和图形数据四部份构成.按照微软的定义,在开始的文件头由14个字节构成:

tagBITMAPFILEHEADER= packed record
bfType:WORD; // 位图文件的范例,必须为BM
bfSize:DWORD; // 位图文件的大小,以字节为单位
bfReserved1:WORD; // 位图文件保存字,必须为0
bfReserved2:WORD; // 位图文件保存字,必须为0
bfOffB its:DWORD; // 位图数据的起始位置,以相关于位图
// 文件头的偏移量表示,以字节为单位
End;

  紧接着上一记录的是位图信息头tagBITMAPINFOHEADER,BMP位图信息头数据用于阐明位图的尺寸等信息.这个信息头就是上文说的TBitmapInfoHeader,它的长度固定为40字节.

tagBITMAPINFOHEADER= packed record
biSize:DWORD; // 本构造所占用字节数
biWidth:LONGINT // 位图的宽度,以像素为单位
biHeight; :LONGINT // 位图的高度,以像素为单位
biPlanes; :WORD // 目标设备的级别,必须为1
biBitCount :WORD // 每个像素所需的位数,必须是1(双色),
// 4(16色),8(256色)或24(真彩色)之一
biCompression :DWORD; // 位图压缩范例,必须是 0(不压缩),
// 1(BI_RLE8压缩范例)或2(BI_RLE4压缩范例)之一
biSizeImage :DWORD; // 位图的大小,以字节为单位
biXPelsPerMeter:LONGINT; // 位图水平辨别率,每米像素数
biYPelsPerMeter:LONGINT; // 位图垂直辨别率,每米像素数
biClrUsed:DWORD;// 位图实际利用的颜色表中的颜色数
biClrImportant:DWORD;// 位图显示历程中重要的颜色数
End;

  紧接着就是颜色表,用于阐明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD范例的构造,定义一种颜色.RGBQUAD构造的定义以下:

tagRGBQUAD = packed record
rgbBlue:BYTE;// 蓝色的亮度(值范围为0-255)
rgbGreen:BYTE; // 绿色的亮度(值范围为0-255)
rgbRed:BYTE; // 红色的亮度(值范围为0-255)
rgbReserved:BYTE;// 保存,必须为0
end;

  颜色表中RGBQUAD构造数据的个数有biBitCount来肯定:

  当biBitCount=1,4,8时,辨别有2,16,256个表项;

  当biBitCount=24时,没有颜色表项.

  位图信息头和颜色表构成位图信息,BITMAPINFO构造定义以下:

tagBITMAPINFO = packed record
bmiHeader :BITMAPINFOHEADER; // 位图信息头
bmiColors[0..0] :RGBQUAD; // 颜色表
End;


  以上是“<b>用Delphi实现24位真彩色图标</b>[Delphi编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .