用Delphi实现24位真彩色图标

来源:互联网 发布:小鸡模拟器数据迁移 编辑:程序博客网 时间:2024/04/30 02:31

 

24位真彩色图形转化为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;
 

 

有了BMP图像了,我们还要改变图像的长和宽,使它们符合要求的图表尺寸,注意不超出255。我们用如下方法实现尺寸的改变:

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;
  生成位图的原料已经准备好了,就可以按ICO的文件头,关于程序的说明请看注释。

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;
  有了文件头,最终可以生成ICO了,同样详细内容请看程序的注释。

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;
  结束语

  目前Delphi支持的图片格式比较多,例如我们可以给程序加上uses jpeg 语句就可以支持Jpeg格式的图像,当然如你给Delphi安装了支持其他图像格式的控件,使用本程序照样可以转换,得到的ICO文件可以供VB、Delphi等调用。程序的调试环境为Delphi7+WinxpSp2。

原创粉丝点击