您的位置:首页 > 编程语言 > Delphi

用Delphi实现24位真彩色图标

2011-10-12 12:25 253 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: