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

Signaler
Messages postés
73
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
12 mai 2013
-
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
-
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?

4 réponses

Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
28 mai 2020
29
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]
Messages postés
73
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
12 mai 2013

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.
Messages postés
73
Date d'inscription
mardi 3 avril 2007
Statut
Membre
Dernière intervention
12 mai 2013

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.
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
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