海信家电”换帅 “ 高玉玲接替代慧忠出任新任董事长
2024-11-22
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; |
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个字节 |
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; |
tagBITMAPFILEHEADER= packed record bfType:WORD; // 位图文件的类型,必须为BM bfSize:DWORD; // 位图文件的大小,以字节为单位 bfReserved1:WORD; // 位图文件保留字,必须为0 bfReserved2:WORD; // 位图文件保留字,必须为0 bfOffB its:DWORD; // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位 End; |
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; |
tagRGBQUAD = packed record rgbBlue:BYTE;// 蓝色的亮度(值范围为0-255) rgbGreen:BYTE; // 绿色的亮度(值范围为0-255) rgbRed:BYTE; // 红色的亮度(值范围为0-255) rgbReserved:BYTE;// 保留,必须为0 end; |
tagBITMAPINFO = packed record bmiHeader :BITMAPINFOHEADER; // 位图信息头 bmiColors[0..0] :RGBQUAD; // 颜色表 End; |
24位真彩色图形转化为ICO文件
有了上面的基础知识,把24位真彩色图形转化为ICO文件就比较简单了,至于采用哪种编程语言,就看编程者的爱好了。下面笔者就采用Delphi实现本功能,进行详细介绍。
上面讲的是把BMP格式的图像转换为ICO文件,因此,对于其他格式的图像我们要先把它转换为位图。在Delphi中我们可以采用如下方法:
procedure TFormMain.Pic2BMP(Picture:TPicture); var Bmp:TBitmap; begin if not(Picture.Graphic is TBitmap)then//判断是否是BMP图像 begin Bmp:=TBitmap.Create;//不是BMP图形,就生成一个 try Bmp.Width:=Picture.Width; bmp.Height:=Picture.Height; bmp.Canvas.Draw(0,0,Picture.Graphic);//把其他格式的图像复制到BMP Picture.Graphic:=Bmp;//原始非BMP图像转换为BMP图像 Finally Bmp.Free; end; end; end; |
procedure TFormMain.PicToMiniature(SourceBMP, DescBMP:TBitmap; picH,picW :Integer); var bmp: TBitmap; begin try bmp := TBitmap.Create;//生成位图 bmp.Assign(SourceBMP);//位图图像为SourceBMP, if picW>255 then PicW:=255;//长宽不可超出255 if picH>255 then picH:=255; bmp.Width := PicW; bmp.Height :=PicH; bmp.PixelFormat := pf24bit;//24位位图 bmp.Canvas.StretchDraw(Rect(0,0,picW,picH), SourceBMP);//使位图尺寸符合要求 DescBMP.Assign(bmp); finally bmp.Free; end; end; |
function TFormMain.MakICOHead(const Mem:TStream): Boolean; var//采用流来生成 BMPHead1:tagBITMAPFILEHEADER; BMPHead2: TBitmapInfoHeader; BitsTotal:DWord; begin Result:=False; Mem.Position:=0; Mem.Read(BMPHead1,SizeOf(tagBITMAPFILEHEADER));//读取BMP文件由文件头 Mem.Read(BMPHead2,SizeOf(TBitmapInfoHeader));// 读取BMP位图信息头 if BMPHead2.biCompression=0 then //位图没有压缩 begin if (BMPHead2.biWidth<=255) and (BMPHead2.biHeight <=255)then begin //caption:=IconFileName; IconHand.idEntries.bWidth:= Byte(BMPHead2.biWidth) ;//IOC宽 IconHand.idEntries.bHeight:=Byte(BMPHead2.biHeight); //IOC高 BitsTotal:=(Mem.Size-54)*2+40; //(BMP文件的大小- 文件头、位图信息头)*2+位图信息头=ICO数据量 //乘以二的原因是:加icXOR的信息 IconHand.idEntries.dwBytesInRes:= BitsTotal; IconHand.idEntries.dwImageOffset:=$00000016; Result:=True; end; Mem.Position:=0; end; end; |
function TFormMain.MakICOData( Mem:TStream): Boolean; var Mem1,Mem2:TMemoryStream; Size:Longint; BmtMapHandle2:TBitmapInfoHeader; begin Mem1:=TMemoryStream.Create; Mem2:=TMemoryStream.Create; Size:=Mem.Size-14;//跳过14字节的BMP文件由文件头 Mem.Position:=14; try Mem1.SetSize(Size); Mem.Read(Mem1.Memory^,Size);//BMP到Mem1 Mem1.Seek(0,soFromBeginning); Mem1.Read(BmtMapHandle2,sizeof(TBitmapInfoHeader));//BMP文件的信息头 Mem2.SetSize(Size-40);//跳过40字节的BMP文件信息头 FillChar(Mem2.Memory^,Size-40,$0);//Mem2填充0 ,使掩码效果为白色 Mem2.Position:=0; BmtMapHandle2.biHeight:=IconHand.idEntries.bHeight *2;//有两幅图 BmtMapHandle2.biSizeImage:=Mem2.Size*2; Mem1.Seek(0,soFromBeginning); Mem1.Write(BmtMapHandle2,sizeof(TBitmapInfoHeader)); Mem1.Position:=0; Mem.Size:=0; //MS.SetSize(0); Mem.Write(IconHand,sizeof(tagIconDir){22});//写ICO文件头 Mem.Write(Mem1.Memory^,Mem1.Size);//写BMP片 Mem.Write(Mem2.Memory^,Mem2.Size);//写掩码 Result:=True; finally FreeAndNil(Mem1); FreeAndNil(Mem2); end; end; |
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交