AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Delphi

用Delphi实现24位真彩色图标

51自学网 http://www.wanshiok.com

 

  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;

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

 
 

上一篇:Delphi中用API实现在MSN的信息提示  下一篇:用DELPHI在状态栏中显示进程条