IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Detection d'un fichier image ou texte


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 343
    Points : 124
    Points
    124
    Par défaut Detection d'un fichier image ou texte
    Bonjour,

    Je fais un programme pour ouvrir des fichiers (sans extensions) qui sont soit des images soit des fichiers textes (notepad).

    Donc en l'ouvrant j'ai donc soit du texte soit ca :
    B@M. B@M.@âçvv #@âçvvOÿü«hÞßq¨ûÊü@µ¥-WFUÉD7®…+ ÿü«hÞßq¨ûÊü@µ¥-WFUÉD7®…+Z‘@oNY Z‘@oNYJåH.@g‚¡#§¼ysfC JåH
    .@g‚¡#§¼ysfCƒ@ ƒ@ÆÌ‚ ÏX~YÑ 4¡@øã ÆÌ‚ ÏX~YÑ 4¡@øã
    i@ÿÖ» i@ÿÖ»³â¡ç@HCrB ³â¡ç@HCrBÿúgº± @N=OnÆ
    ‹.Á™ŠÐBC‡FûUÍ@À» ‹.Á™ŠÐBC‡FûUÍ@À»¿__FŽÄ@¤Ä»
    ç†-âÑ`œ-,žIhc@ɦCG¦F´8ßå€@»¶ÚúrOoo ‚ŒvS0¾÷núð@ NK¶(j±hLO‚º ŒvS0¾÷núð@ NK¶(j±hLO‚ºî·Hœ@í î·Hœ@íí÷ÞU@ä»s¨ í÷ÞU@ä»s¨
    aEh@ó aEh@óç”é4-w®Å=[@MºÒ ç”é4-w®Å=[@MºÒ“.Ùwœ¼SqfZ¢
    @R,r4– “.Ùwœ¼SqfZ¢@R,r4–

    Comment puis je faire pour différencier un fichier texte à ce arabiat ?
    merci davance

  2. #2
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Les fichiers image ont des entêtes permettant de déterminer le type d'image (BMP, JPEG, GIF, ...).

    Tu peux tenter de lire cette entête, sachant à quoi tu dois t'attendre, et si tu ne reconnais pas un fichier image, tu peux en conclure que c'est un fichier texte (ou un fichier image que tu ne sais pas lire ).

    Il me semble qu'il y a du code dans le genre dans la VCL. TPicture si je ne m'abuse. À vérifier je regaderai ca. Si c'est ca tu pourrais essayer de charger le fichier dans un TPicture, et si ca déconne, tu gères l'exception pour prendre en charge le fichier comme un fichier texte.

  3. #3
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Ca y est j'ai retrouvé ce que je cherchais.

    Ce dont je te parlais en tout premier lieu, nous l'avions déjà (récupéré plus que) codé il y a bon bout de temps, mais nous ne l'utilisons plus.

    Voici ce que ca donnait dans l'idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    function ReadGraphic(ContentStream: TStream): TGraphic;
    var
      Bytes: array[0..7] of Byte; // Used for reading in the image header
    begin
      ContentStream.Position := 0;
      ContentStream.Read(Bytes[0], SizeOf(Bytes));
      // 0xFFD8 is the starting marker for a JPEG
      if (Bytes[0] = $FF) and (Bytes[1] = $D8) then
        Result := TJPEGImage.Create
      // 'GIF' (as in the string literal) is the starting marker
      // for a GIF
      else if (Bytes[0] = Ord('G')) and { Do not localize}
              (Bytes[1] = Ord('I')) and { Do not localize}
              (Bytes[2] = Ord('F')) then { Do not localize}
        begin
          Result := TGIFImage.Create;
    //      With TGIFImage(Result) do
    //        Transparent := true;
        end
      // For ping, the first 8 bytes header is:
      // (HEX)                 89  50  4e  47  0d  0a  1a  0a
      // (ASCII C notation)    \211   P   N   G  \r  \n \032 \n
      else if (Bytes[0] = $89) and
              (Bytes[1] = $50) and
              (Bytes[2] = $4e) and
              (Bytes[3] = $47) and
              (Bytes[4] = $0d) and
              (Bytes[5] = $0a) and
              (Bytes[6] = $1a) and
              (Bytes[7] = $0a) then
        Result := TPNGObject.Create
      else if (Bytes[0] = Ord('B')) and   { Do not localize}
               (Bytes[1] = Ord('M')) then // Windows bitmap  { Do not localize}
        Result := TBitmap.Create
      else
        raise Exception.Create('Format d''image incorrect');
      // Go back to the start of the file.
      ContentStream.Position := 0;
      Result.LoadFromStream(ContentStream);
    end;
    Mais heureusement, GraphicEx est là, et c'est surement mieux fait que dans le précédent code.

    En faisant le uses de GraphicEx, tu auras accès à FileFormatList, dont tu pourras appeler cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function TFileFormatList.GraphicFromContent(Stream: TStream): TGraphicExGraphicClass;
    Donc tu tentes de charger directement ton TFileStream, et si ca ne marche pas, compte tenu du nombre assez impressionnant de types d'images qu'est capable de lire GraphicEx, tu peux te dire "OK, c'est un fichier texte".

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 343
    Points : 124
    Points
    124
    Par défaut
    merci bien DMO

  5. #5
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut Re: Detection d'un fichier image ou texte
    Citation Envoyé par laclac
    Donc en l'ouvrant j'ai donc soit du texte soit ca :
    B@M. B@M.@âçvv #@âçvvOÿü«hÞßq¨ûÊü@µ¥-WFUÉD7®…+
    .....
    Comment puis je faire pour différencier un fichier texte à ce arabiat ?
    C'est très simple et bien plus que d'aller chercher des librairies de la mort qui tue pour détecter les formats graphiques... D'autant qu'il suffira d'une image fournie dans un format non reconnu par la dite librairie pour que tout tombe à l'eau !

    C'est dans l'autre sens qu'il faut penser le problème. Si c'est un fichier texte lisible par un humain il répond à quelques règles statistiques très simples... Par exemple au moins 90% des symboles sont des lettres ou des chiffres et pas des codes ansi à la noix qui font des petits symboles.
    De même, en occident au moins, la lettre A ou la lettre E sont les plus utilisées. Ce genre de stats se trouvent certainement facilement sur le net pour avoir des chiffres précis.
    Une simple analyse par comptage des 100 ou 500 premiers octets permet à coup sur de décider si c'est un texte de type notepad.
    Facile, rapide, quelques lignes de code, pas de lib de la mort, et très très peu de chances de se tromper...

  6. #6
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    C'est une chose auquel j'avoue, je n'aurai jamais pensé Merlin
    Moi j'aurai plutot analysé l'entête des fichiers pour déterminer leurs natures, les formats images utilisés généralement sont le bitmap, le gif, le jpeg et le png, à partir de là, je suppose que si le fichier en question ne fait pas parti de ces format, c'est un fichier texte.
    Pour les structures de ces fichiers voir ici

  7. #7
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Bien vu Merlin, la technique de le prendre par l'autre bout n'est pas mal du tout ! GraphicEx n'est pas non plus une "lib de la mort" mais il est vrai qu'avec ta façon de faire, on peut dire "format d'image non reconnu", ce qui n'était pas le cas avec ce que je proposais.

    Ensuite, après l'analyse par comptage des premiers caractères, si l'on détecte que c'est une image qu'il faut charger, ce que j'ai proposé reste valable dans le cas où il faut détecter le type d'image en fonction du contenu, et il le faut si ce n'est pas un seul et même type d'image qui est utilisé conjointement aux fichiers texte.

Discussions similaires

  1. Stocker une image + du texte dans un fichier
    Par TheBlackReverand dans le forum C#
    Réponses: 5
    Dernier message: 03/06/2008, 13h48
  2. fichier en sortie (texte et image)
    Par psyko72 dans le forum Qt
    Réponses: 1
    Dernier message: 12/12/2007, 20h52
  3. Reconnaissance de texte dans un fichier image
    Par annalou dans le forum Windows
    Réponses: 1
    Dernier message: 22/06/2007, 15h18
  4. Réponses: 7
    Dernier message: 17/03/2006, 13h26
  5. découpage de fichier image + texte
    Par dirty_boy dans le forum C
    Réponses: 8
    Dernier message: 13/03/2006, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo