2011-07-13 9 views
3

J'ai une table contient Image dans un champ d'image et je vais les mettre dans une ImageList. Voici le code:Ajouter une image étirée à ImageList dans Delphi

ImageList.Clear; 
ItemsDts.First; 
ImageBitmap:= TBitmap.Create; 
try 
    while not ItemsDts.Eof do 
    begin 
    if not ItemsDtsPicture.IsNull then 
    begin 
     ItemsDtsPicture.SaveToFile(TempFileBitmap); 
     ImageBitmap.LoadFromFile(TempFileBitmap); 
     ImageList.Add(ImageBitmap, nil); 
    end; 
    ItemsDts.Next; 
    end; 
finally 
    ImageBitmap.Free; 
end; 

Mais j'ai un problème pour les images avec la taille de la différence de taille ImageList. Mon problème est que lors de l'ajout d'image plus grande que la taille ImageList (32 * 32), par exemple 100 * 150 Il n'apparaît pas correctement dans un composant connecté à ImageList (par exemple dans un ListView). Il semble que l'image nouvellement ajoutée ne soit pas étirée mais qu'elle soit recadrée. Je veux que la nouvelle image soit étirée comme dans l'éditeur ImageList.

+0

Ce n'est pas une question pour le moment. "J'ai un problème avec les images dont la taille diffère de celle d'ImageList." S'il vous plaît décrire exactement quels sont les problèmes et poser une question spécifique et directe. –

+0

Quels problèmes avez-vous? À quoi ressemblent les images, comment les chercher? –

+1

@David Heffernan et @Cosmin Prund: Désolé. La question a été mise à jour ... – mtoloo

Répondre

5

Je ne sais pas si ImageList fournit une propriété pour étirer automatiquement l'image. À moins que quelqu'un ne trouve une partie intégrée, vous pouvez toujours étirer l'image vous-même avant de l'ajouter à ImageList. Et pendant que vous y êtes, arrêtez d'utiliser le fichier sur disque: utilisez plutôt un TMemoryStream. Quelque chose comme ceci:

var StretchedBMP: TBitmap; 
    MS: TMemoryStream; 

ImageList.Clear; 
ItemsDts.First; 
StretchedBMP := TBitmap.Create; 
try 

    // Prepare the stretched bmp's size 
    StretchedBMP.Width := ImageList.Width; 
    StretchedBMP.Height := ImageList.Height; 

    // Prepare the memory stream 
    MS := TMemoryStream.Create; 
    try 
    ImageBitmap:= TBitmap.Create; 
    try 
     while not ItemsDts.Eof do 
     begin 
     if not ItemsDtsPicture.IsNull then 
     begin 
      MS.Size := 0; 
      ItemsDtsPicture.SaveToStream(MS); 
      MS.Position := 0; 
      ImageBitmap.LoadFromStream(MS); 
      // Stretch the image 
      StretchedBMP.Canvas.StretchDraw(Rect(0, 0, StretchedBmp.Width-1, StretchedBmp.Height-1), ImageBitmap); 
      ImageList.Add(StretchedBmp, nil); 
     end; 
     ItemsDts.Next; 
     end; 
    finally MS.Free; 
    end; 
    finally StretchedBMP.Free; 
    end; 
finally 
    ImageBitmap.Free; 
end; 

PS: Je modifié votre code dans la fenêtre du navigateur. Je ne peux pas garantir qu'il compile, mais si ce n'est pas le cas, il devrait être facile à corriger.

+0

Merci beaucoup. Ça marche. Merci également d'utiliser MemoryStream. J'essayais d'utiliser TMemoryStream avant, mais je ne pouvais pas. Comme je ne connaissais pas la taille et la position de mise à zéro est nécessaire. – mtoloo

+0

Mais le seul problème est que les images ne sont plus transparentes. Donc, je pose une autre question: http://stackoverflow.com/questions/6688356/add-transparent-and-stretched-image-to-imagelist-in-delphi – mtoloo

Questions connexes