Connaitre les dimensions d'une image API windows?

Résolu
shell13010 Messages postés 73 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 12 mai 2013 - 11 mai 2013 à 12:02
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 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?

4 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 mai 2013 à 13:04
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]
3
shell13010 Messages postés 73 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 12 mai 2013 1
12 mai 2013 à 01:02
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.
0
shell13010 Messages postés 73 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 12 mai 2013 1
12 mai 2013 à 18:35
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.
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
12 mai 2013 à 19:51
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
0
Rejoignez-nous