Je cherche sans succès depuis un moment un logiciel libre me permettant de créer des icones multi-résolution pour Windows.

Je me suis donc décidé à écrire en Delphi, un petit outils pour réaliser cette tâche bien précise : créer un fichier .ico contenant toute les résolutions et profondeurs nécessaires à partir d'une image quelconque. Dés que le développement sera finalisé, je l'annoncerai ici.

Pour me simplifier la tâche j'utilise le génial ImageMagick qui dispose d'un moteur accessible en OLE Automation. La difficulté consiste à créer un SafeArray contenant les différents paramètres à passer à ImageMagickObject.

Voici un extrait du code permettant de réaliser ça :

 procedure TFormMain.Convert( ImgSource, ImgDest:TImage; SizeX, SizeY : Integer;PixelFormat: TPixelFormat);
 var
   SrcName, DestName : String;
   sa_cmdline : Variant;
   Params : PSafeArray;
   StrList : TStringList;
   i : Integer;
 begin
   StrList := TStringList.Create;
   SrcName := ExtractFilePath(Application.ExeName)+'tmp.bmp';
   DestName := Format(ExtractFilePath(Application.ExeName)+'tmpdest%d_%d.bmp',[SizeX,ord(PixelFormat)]);
   ImgSource.Picture.SaveToFile(SrcName);
   StrList.Add('-geometry');
   StrList.Add(Format('%dx%d',[Sizex,SizeY]));
   Case PixelFormat of
     pf1bit  : begin
       StrList.Add('-monochrome');
       StrList.Add('-dither');
     end;
     pf4bit  : begin
       StrList.Add('-colors');
       StrList.Add('-16');
       StrList.Add('-dither');
     end;
     pf8bit  : begin
       StrList.Add('-colors');
       StrList.Add('-256');
       StrList.Add('-dither');
     end;
     pf16bit : begin
       StrList.Add('-colors');
       StrList.Add('-65536');
     end;
   end;
   StrList.Add(SrcName);
   StrList.Add(DestName);
   sa_cmdline := VarArrayCreate([0,StrList.Count-1], varVariant);
   for i := 0 to StrList.Count-1 do
     sa_cmdline[i]:=StrList[i];
   Params := PSafeArray(TVarData(sa_cmdline).VArray);
   MagickImage1.Convert(Params);
   ImgDest.Picture.LoadFromFile(DestName);
   StrList.Free;
 end;