Connaitre les dimensions d'une image API windows? [Résolu]

Messages postés
73
Date d'inscription
mardi 3 avril 2007
Dernière intervention
12 mai 2013
- - Dernière réponse : korgis
Messages postés
426
Date d'inscription
samedi 17 mai 2003
Dernière intervention
16 février 2019
- 12 mai 2013 à 19:51
Bonjour,

Est-il possible de connaitre les dimensions d'une image du type GIF,png avec l'api Windows?

j'ai trouver une fonction qui permet de détecter les dimensions d'une image GIF mais les informations son erroné.

Je sais que l'on peut récuperer les informations d'un executables mais pour le reste?
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
42
3
Merci
re

la prochaine fois précise de suite
avec quelle version du compilateur
tu as essayé ...


donc voici la version qui fonctionne avec tous les compilateurs Ansi & Unicode (normalement ... je ne les possède pas tous)

unit Unit2;

interface
uses SysUtils, StrUtils, Variants, Dialogs;
   function GetImageSize(const aFileName : TFileName; out aWidth, aHeight: Integer):Boolean;
implementation
uses ComObj;


function ExcludeChars(const S : AnsiString; const CS : TSysCharSet): AnsiString;
var P, PR : PByte;
    BS : set of Byte absolute CS;
    Size, I    : Integer;
begin
  P    := PByte(S);
  Size := Length(S);
  SetLength(Result, Size);
  PR   := PByte(Result);
  I := 0;
  while P^ <> $0 do
  begin
    if not (P^ in BS) then
    begin
      Pr^ := P^;
      Inc(Pr);
    end
    else Inc(I);
    Inc(P);
  end;
  if I > 0 then SetLength(Result, Size - I)
end;




function GetImageSize(const aFileName : TFileName; out aWidth, aHeight: Integer):Boolean;
var FDir, FName, TMP : AnsiString;
    Index : Integer;
    FShellApp, FShellFolder : Variant;
begin
  Result := False;
  if FileExists(aFileName) then
  try
    FDir  := AnsiString(ExtractFileDir(aFileName));
    FName := AnsiString(ExtractFileName(aFileName));
    FShellApp := CreateOleObject('Shell.Application');
    try
      FShellFolder := FShellApp.NameSpace(Variant(FDir));
      TMP := AnsiString(FShellFolder.GetDetailsOf(FShellFolder.ParseName(Variant(FName)), 26));
      TMP := ExcludeChars(TMP, #32);
      Index := Pos('x', string(TMP));
      if Index > 0 then
      begin
        aWidth  := StrToInt(Copy(string(TMP), 1, Index - 1));
        aHeight := StrToInt(Copy(string(TMP), Index + 1, High(Integer)));
        Result := True;
      end;

    except on E : Exception do
      begin
        MessageDlg(Format('Une erreur %s avec le message : %s'#13#10'est survenue', [E.ClassName, E.Message]), mtINFORMATION,
        [mbOk], 0);
      end;
    end;

  finally
    FShellApp := Unassigned;
    FShellFolder := Unassigned;
  end;
end;
end.




[hr]@+Cirec
[hr]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
42
0
Merci
Salut,

regarde ceci c'est pile ce que tu cherches




[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
73
Date d'inscription
mardi 3 avril 2007
Dernière intervention
12 mai 2013
0
Merci
Salut cirec,

J'ai une erreur de Type EAccessViolaation l'érreur détailler:
AccessViolation at adress 004b6999

la ligne concerné après debug:
TMP := FShellFolder.GetDetailsOf(FShellFolder.ParseName(Variant(FName)), 26);


Si elle est capable de lire tout les types de fichiers, c'est tout simplement le must et surtout on a pas besoin de lib car pour récupérer les dimensions d'un fichier de type GIF, c'est la croix et la banniére.
Commenter la réponse de shell13010
Messages postés
73
Date d'inscription
mardi 3 avril 2007
Dernière intervention
12 mai 2013
0
Merci
Salut,

Désoler, je ne savait pas que sa avait un rapport avec le compilateur...

Sinon sa marche a la perfection, cette fonction devrait faire partie des snippet.

j'ai tester avec plusieurs type de fichier et tout fonctionne comme une horloge..

Je te remercie car je penser que c'étais plus complexe, mais tu as prouver le contraire

Bonne fin d'après midi.
Commenter la réponse de shell13010
Messages postés
426
Date d'inscription
samedi 17 mai 2003
Dernière intervention
16 février 2019
15
0
Merci
je ne savait pas que sa avait un rapport avec le compilateur

si, si...

Pour compiler avec D4 (D quoi ? ), remplacer le type "Variant" par "OleVariant".
Sans oublier de faire pareil pour le transtypage, ici :

//FShellFolder := FShellApp.NameSpace(Variant(FDir));
//TMP := AnsiString(FShellFolder.GetDetailsOf(FShellFolder.ParseName(Variant(FName)), 26));
FShellFolder := FShellApp.NameSpace(OleVariant(FDir));
TMP := AnsiString(FShellFolder.GetDetailsOf(FShellFolder.ParseName(OleVariant(FName)), 26));


Super, ce code
Commenter la réponse de korgis

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.