2009-11-18 9 views
1

mon application a 3 contrôles: TThumbnailList (visionneuse d'image des composants TMS), TImage, et TLabel. Je souhaite que lorsque je fais glisser une image de TThumbnailList à TImage, et le dépose, l'objet TLabel montre la taille en octets pour cette image. Comment est-ce que je reçois ceci? Merci d'avance.Comment obtenir la taille d'une image en octets avec Delphi?

procedure TForm1.AssignImage; 
begin 
    //tl: TThumbnailList 
    if (tl.ItemIndex>=0) then begin 
    Image1.Picture.Assign(tl.Thumbnails.Items[tl.ItemIndex].Picture); 
    end; 
end; 

procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer); 
begin 
    if (Source is TThumbnailList) then AssignImage; 
end; 

procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; 
    var Accept: Boolean); 
begin 
    Accept:= Source is TThumbnailList; 
end; 
+1

Que voulez-vous dire par « la taille de l'image »? La taille totale de l'objet TImage? La taille du fichier d'origine à partir duquel il a été chargé? La taille des données d'image non compressées? –

+0

Désolé, je voulais dire "taille du fichier original". Il existe une procédure qui utilise TMemoryStream pour obtenir la taille, mais je dois créer un nouvel objet pour chaque image supprimée, donc TImage a-t-il des propriétés pour montrer cette information? Merci encore. –

Répondre

1

Vous pouvez utiliser la fonction suivante pour rechercher le fichier et renvoyer la taille.

function FindFileSize(Filename:string):integer; 
var 
    sr : TSearchRec; 
begin 
    if FindFirst(filename,faAnyFile-faDirectory,sr) = 0 then 
    Result := sr.Size 
    else 
    raise EFileNotFoundException.Create(filename+' not found.'); 
    FindClose(sr); 
end; 
2

TImage n'a aucun moyen de déterminer la taille de tout graphique qu'il détient à un moment donné. Ce n'est pas son travail. Son travail est seulement à afficher choses. L'objet TGraphic gère la représentation en mémoire et détermine également comment se dessiner sur un canevas donné. TImage ne sait vraiment rien du tout. TGraphic pourrait, mais il ne garde pas nécessairement trace de la taille du fichier; cela pourrait être différent de la quantité de mémoire nécessaire pour avoir les données en mémoire.

La façon de déterminer la taille d'un fichier est de avoir un fichier ou quelque chose comme un fichier, comme un flux. Comme vous l'avez mentionné dans votre commentaire, vous pouvez enregistrer l'image dans un flux, puis connaître la taille du flux.

function GetGraphicSize(g: TGraphic): Integer; 
var 
    ms: TStream; 
begin 
    ms := TMemoryStream.Create; 
    try 
    g.SaveToStream(ms); 
    Result := ms.Size; 
    finally 
    ms.Free; 
    end; 
end; 

Si c'est trop coûteux pour calculer chaque fois que vous avez besoin de la taille, alors souvenez-vous de la taille de la première fois que vous voyez l'image de sorte que vous n'avez pas besoin d'ordinateur, il de nouveau à chaque fois. Comment la liste des vignettes a-t-elle obtenu ses images? Si elles venaient de fichiers, alors vous auriez pu simplement récupérer la taille du fichier pendant que vous produisiez les vignettes.

0

bla, si je ne me trompe pas, c'est ce que vous voulez

// this will return the size of the bitmap in bytes! 
function BitmapSize(ABitmap: TBitmap): Cardinal; 
var ms : TMemoryStream; 
begin 
    ms := TMemoryStream.Create; 
    ABitmap.savetostream(ms); 
    result := ms.size; 
    FreeAndNil(ms); 
end; 

Amusez-vous, ne pas oublier de visiter http://delphigeist.blogspot.com/ si la réponse est utile!

+3

N'est-ce pas la solution de Rob, juste moins flexible (TBitmap au lieu de TGraphic) et moins sûre (sans exception)? –