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

Delphi Discussion :

Lire et afficher un BMP sans header


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut Lire et afficher un BMP sans header
    Bonjour à tous,

    Je suis sur un petit projet de soft afin de customiser facilement la tablette de mon "grand" (4 ans). c'est une storio Vtech.
    Le format des icones est un peu particulier. De ce que je comprends, ce sont des bmp de 57x57 ou 88x88 pixel, sans header. :

    "Game icons are 57 x 57, book icons are 88 x 88
    They are 16bit xRGB data, with the first 8 bytes being the width and height stored as 32bit integers in little endian format."

    La question logique qui vient est donc : comment lire/ecrire et afficher dans un Tbitmap ce genre de format?

    C'est surement très simple, mais j'avoue que je cale.

    Merci d'avance

  2. #2
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 111
    Par défaut
    Un simple filestream devrait suffire a ton bonheur, il me semble...

    Tu lis les 2 premier integer pour connaître la lageur et la hauteur puis tu lis le reste du fichier dans un tableau soit de 57 X 57 soit de 88 X 88

    Ensuite si j'ai bien compris les donnees sont directement le code couleur de chaque pixel...

    C'est assez simple en fait...

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    Le plus simple à mon avis :
    1) transformer une icône de chaque taille en Bitmap Windows à l'aide de Xn View ou autre logiciel
    2) enregistrer les en-têtes de ces fichiers jusqu'au tableau de pixels (donc couper à 2*57*57 et 2*88*88 octets de la fin)
    3) coller à leur suite (TStream) les 2*57*57 ou 2*88*88 octets de la fin de chaque icône.

    Si ça ne fonctionnait pas (pas de logiciel externe prenant en charge la conversion de format), il suffirait d'encoder ces en-têtes dans un flux en se basant sur le format d'un fichier BitMap de Windows.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre confirmé
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut
    Citation Envoyé par der§en Voir le message
    Un simple filestream devrait suffire a ton bonheur, il me semble...

    Tu lis les 2 premier integer pour connaître la lageur et la hauteur puis tu lis le reste du fichier dans un tableau soit de 57 X 57 soit de 88 X 88

    Ensuite si j'ai bien compris les donnees sont directement le code couleur de chaque pixel...

    C'est assez simple en fait...
    bonjour,

    C'est bien en gros la solution que je voyais, mais je pêche sur la realisation. Je suis pas très a l'aise avec les stream. Un petit exemple svp

    Merci

  5. #5
    Membre confirmé
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut
    Bon j'avance.

    J'arrive a lire les 2 entiers fixant la taille du bitmap et je les affecte à un tbitmap.
    Reste le problème des données du bitmap. Comment les affecter directement au canvas d'un tbitmap?

  6. #6
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Par la fonction ScanLine.

    As-tu un fichier d'exemple? (pour tester)

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    sur mon ancien GHT G3 il utilisait des images dans un format fixe 200x200 pixels en 16bits, voici la procédure utilisée pour charger une image

    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
     
    procedure TForm1.LoadImage(cIndex: Integer);
    var
      cFileName : string;
      cStream: TFileStream;
      cBitmap: TBitmap;
      x, y   : Integer;
    begin
      cFileName := FPath + 'icon\album' + IntToStr(cIndex) + '.jpeg';
      if not FileExists(cFileName) then
      begin
        Image1.Picture := nil;
        Exit;
      end;
      cStream := TFileStream.Create(cFileName, fmOpenRead);
      try
        if cStream.Size <> 80000 then // vérification de la taille
          Exit;
        cBitmap := TBitmap.Create;
        cBitmap.PixelFormat := pf16Bit; // 16 bits
        cBitmap.Width := 200;
        cBitmap.Height := 200;
        for y := 0 to cBitmap.Height - 1 do
        begin
          cStream.ReadBuffer(cBitmap.ScanLine[y]^, 2 * cBitmap.Width); // Chargement de 2 octets par pixel
        end;
        Image1.Picture.Assign(cBitmap);
        cBitmap.Free;
      finally
        cStream.Free;
      end;
    end;
    pour l'écriture c'est la même chose ou presque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       cStream := TFileStream.Create(FPath + 'icon\album' + IntToStr(cIndex) + '.jpeg', fmCreate);
        try
          for y := 0 to cBitmap.Height - 1 do
            cStream.WriteBuffer(cBitmap.ScanLine[y]^, 2 * cBitmap.Width);
        finally
          cStream.Free;
        end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lire un fichier de donnees sans le header
    Par follichon dans le forum MATLAB
    Réponses: 1
    Dernier message: 17/01/2013, 13h10
  2. [Débutant][Math] Afficher un nombre sans exposant
    Par tanguy dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 24/09/2012, 13h58
  3. Afficher une image sans URL dans un forum
    Par Vanesse dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 01/03/2006, 17h55
  4. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13
  5. [Turbo Pascal] Lire une touche au clavier sans interrompre le programme
    Par Allelouia dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 29/03/2003, 22h31

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