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 :

Récupération d'un flux en mémoire


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut Récupération d'un flux en mémoire
    Bonjour,

    J'utilise une DLL dont une fonction me permet d'enregistrer un fichier image.
    Cette fonction "saveimage" est paramétrée par un record qui contient l'adresse où est située le flux de l'image et sa longueur,

    Pour simplifier le record à l'aspect suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INFO = record
    size: integer;//taille du record
    image: int64;//position dans la mémoire
    imgsize: integer;//taille de l'image
    end;
    Pour enregistrer sur disque je fais donc
    SaveImage(info, 'c:\...\monimage.bmp');
    Qui fonctionne très bien.

    Ce record ayant été au préalable remplis par une autre function.

    Je cherche à récupérer l'image dont les caractéristiques sont dans INFO, pour les stocker dans un TmemoryStream.

    J'ai tenté de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    aStream:= TmemoryStream.create;
    aStream.write(info.image, info.imgSize);
    Mais j'ai une violation d'accès.

    J'ai tenté ceci aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aStream:= TmemoryStream.create;
    aStream.size:= info.imgSize;
    aStream.write(info.image, info.imgSize);
    Même problème.

    Avez vous une idée ?

    Merci
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    soit le champ "image" est un pointeur et dans ce cas il faut utiliser aStream.write(pointer(info.image)^ , info.imgSize);, soit ce n'est pas un pointeur et tu ne connais donc pas l'adresse de l'image en mémoire...ce qui me semble le plus probable vu que "image" est un int64, peut-être un index dans une liste, ou un offset relatif à un block mémoire dont tu ne connais pas l'adresse de base.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    soit le champ "image" est un pointeur et dans ce cas il faut utiliser aStream.write(pointer(info.image)^ , info.imgSize);, soit ce n'est pas un pointeur et tu ne connais donc pas l'adresse de l'image en mémoire...ce qui me semble le plus probable vu que "image" est un int64, peut-être un index dans une liste, ou un offset relatif à un block mémoire dont tu ne connais pas l'adresse de base.
    Merci, c'était effectivement la bonne synthaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aStream.write(pointer(info.image)^ , info.imgSize);
    Mais j'avais écris un peu vite ma déclaration, ce n'était qu'un integer et non un int64.

    Il ne me reste plus qu'a trouver, comment reconstruire mon image,
    car il semblerait que les lignes soient inversées, par rapport à un bitmap dans Delphi.
    C'est du propriétaire...l'origine semble commencer en bas à gauche, au lieu de en haut à gauche.
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    dans ce cas autant changer la déclaration et mettre un Pointer

    ce sont les bitmaps de Windows qui ont la tête en bas mais il est possible de définir une hauteur négative pour redresser l'image.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    dans ce cas autant changer la déclaration et mettre un Pointer

    ce sont les bitmaps de Windows qui ont la tête en bas mais il est possible de définir une hauteur négative pour redresser l'image.
    Oui, merci, c'est ce que j'avais fait...c'est un pointer au final.

    Pour l'image, quand je compare avec le bitmap d'origine, dans mon test chaque ligne fait 1604 octets. La première ligne du fichier bitmap est la dernière du fichier memoire.

    J'ai dans mon memorystream, une image à l'envers. C'est pas trop compliqué à corriger.
    Par contre, ce qui m'embête plus, c'est que le memorystream ne contient pas l'entête du fichier, il doit être créé dans la function saveImage.
    Mon fichier bitmap fait ~1 ko de plus que mon memorystream.

    J'ai donc au final, tous les pixels de mon bitmap dans le stream, qu'il faut que je recopie dans un Canvas pixel/pixel ou y a t il une façon plus rapide ?

    Je ne vois pas de méthode me permettant de recopier dans le canevas un buffer, correspondant à une ligne par exemple.

    Au final, mon objectif étant de ne pas enregistrer mon image, (qui provient d'un scanner spécial), sur disque, mais de l'enregistrer en BDD, comme je le fais habituellement, sauf que jusqu'ici, je sauvegardais sur disque pour charger mon Stream ensuite, ce qui n'est pas très optimum.


    Le graphisme, c'est pas ma tasse de thé
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    si tu connais les dimensions de l'image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    begin
      bitmap := TBitmap.Create;
      bitmap.PixelFormat := pf32bit; // ou autre
      bitmap.Width := www;
      bitmap.Height := hhh;
      Move(Info.Image^, bitmap.ScanLine[hhh-1], Info.imgSize);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Move(Pointer(Info.Image)^, bitmap.ScanLine[hhh-1]^, Info.imgSize);

    Si l'image est copiée correctement
    bitmap.Loasfromstream

Discussions similaires

  1. [1.x] récupération d'un flux généré par symfony
    Par nawbacan dans le forum Symfony
    Réponses: 1
    Dernier message: 13/11/2010, 17h35
  2. récupération d'un flux html avec les données du .cs
    Par cyrano_de_bergerac dans le forum C#
    Réponses: 3
    Dernier message: 26/08/2010, 10h19
  3. Récupération d'un flux et cryptage
    Par jeanjean6 dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 26/05/2010, 02h53
  4. [débutant]JTextArea + récupération d'un flux
    Par ambitious dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2007, 12h49
  5. Récupération/envoie de flux video via IP
    Par innosang dans le forum C++
    Réponses: 4
    Dernier message: 22/02/2007, 09h40

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