用Delphi实现24位真彩色图标

http://tech.ddvip.com   2006年08月01日    社区交流

本文详细介绍用Delphi实现24位真彩色图标

  有了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;

来源:计算机与信息技术    作者:李金刚    责编:豆豆技术应用

正在加载评论...