begin process at 2010 02 10 08:16:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Système

 > 

Mémoire

 > 

Mettre un TBitmap en mémoire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Mettre un TBitmap en mémoire

dimanche 21 juin 2009 à 15:32:38 | Mettre un TBitmap en mémoire

Matware456

Bonjour,

Comme le titre l'indique j'aimerais placer un TBitmap en mémoire, c'est à dire le placer entièrement dans la RAM pour pouvoir le réutiliser dans un autre programme, j'ai bien cherché et je n'ai trouvé que quelques solutions : avec le handle du bitmap (ne marche pas, je croit qu'il est détruit dès que l'on ferme le programme), avec un TMemoryStream (idem) et avec un CreateFileMapping (doit marcher mais je suis un peu perdu dans son utilisation...).

L'idée serait de faire 3 fonctions dans une DLL :
ShareDC(window_handle:HWND):Integer; (récupération du DC déjà programmé mais impossible de mettre le bitmap créé en mémoire, valeur de retour : le handle de l'image en mémoire)
GetPixel(x:integer,y:integer,image_handle:integer):COLORREF; (retourne la couleur du pixel grâce à un ScanLine)
Free(image_handle:integer); (libére l'image de la mémoire)

J'en profite aussi pour vous demander si ces fonctions seront rapide car si elles ne le sont pas, ce n'est pas la peine...
Merci pour votre future aide précieuse ! :)
dimanche 21 juin 2009 à 18:05:11 | Re : Mettre un TBitmap en mémoire

Bacterius

Membre Club
Tu peux vraiment pas le mettre dans un fichier temporaire qui durerait le temps que Windows dure ?

Cordialement, Bacterius !
dimanche 21 juin 2009 à 18:13:56 | Re : Mettre un TBitmap en mémoire

Matware456

Bah malheureusement non, j'ai besoin de ces fonctions pour en remplacer une autre qui est très lente (dans un autre langage) et j'aimerais ne pas passer par le disque (trop lent...).

Merci de ton aide !
matware456
dimanche 21 juin 2009 à 19:10:45 | Re : Mettre un TBitmap en mémoire

Bacterius

Membre Club
Réponse acceptée !
Tu peux mettre dans le fichier paginé de Windows mais j'ai peur qu'il faille établir une connexion simultanée pour effectuer le transfert inter-processus (il faut qu'à un moment, les 2 processus aient le même accès au fichier, car si aucun processus n'a plus accès au fichier paginé ce dernier est détruit.

Cordialement, Bacterius !
dimanche 21 juin 2009 à 19:15:27 | Re : Mettre un TBitmap en mémoire

Matware456

Mmhh, pas pratique... N'y-aurait-il pas d'autre solution ?
Sinon pour le même accès au fichier, c'est-à-dire ?
dimanche 21 juin 2009 à 19:27:44 | Re : Mettre un TBitmap en mémoire

Bacterius

Membre Club
Tu peux lire mon tutoriel sur les pointeurs, il y a un chapitre dédié aux fichiers paginés, tu pourrais y apprendre des trucs.

http://www.delphifr.com/tutoriaux/POINTEURS-DELPHI_962.aspx

Après je t'explique si tu as toujours des questions.

Cordialement, Bacterius !
dimanche 21 juin 2009 à 19:47:32 | Re : Mettre un TBitmap en mémoire

Matware456

Déjà lu... (il est super bien fait ^^)
Mais tu ne parles pas de la suppression de la ressource quand elle n'est plus utilisée, peux-tu m'en dire plus ?

Et sinon pourquoi ne pas tout simplement utilisé le handle d'un TBitmap sans le détruire, ça marcherait peut-être... Mais mes essais n'ont pas été concluant. =/
dimanche 21 juin 2009 à 20:06:31 | Re : Mettre un TBitmap en mémoire

Bacterius

Membre Club
Alors,
Windows a introduit la notion de fichier paginé ... blablabla ... seulement ce fichier n'existe que tant qu'un processus s'en sert. Il existe en fait un compteur de référence sur un objet quelconque (ici le fichier paginé). Lorsqu'il est créé, ce compteur passe à 1. Lorsqu'un processus essaye de créer (ou tente d'ouvrir) le même fichier, le compteur s'incrémente. Lorsqu'un processus libère (ou ferme) le même fichier, le compteur se décrémente. Lorsque le compteur passe à 0, l'objet (fichier paginé) est détruit. C'est pourquoi il faut toujours garder un compteur > 0. Donc, il faudrait faire comme ça :

Processus 1 crée le fichier (Compteur à 1)
Processus 2 ouvre le fichier (Compteur à 2)
Processus 1 ferme le fichier (Compteur à 1)
Processus 2 fait des trucs sur le fichier
Processus 2 libère le fichier (Compteur à 0)

Cordialement, Bacterius !
dimanche 21 juin 2009 à 20:12:43 | Re : Mettre un TBitmap en mémoire

Matware456

Ah ok je croyais que l'espérance de vie du fichiers mappé était limitée. ^^

Moi ça serait plutôt ça :
Processus 1 créé le fichier mappé via une DLL et renvoi son identifiant.
Processus 1 traite des données (sans le fichier mappé).
Processus 1 rentre dans une boucle et analyse les pixels de l'image mappé (grâce à la fonction expliquée dans mon premier message).
Processus 1 libère le fichier mappé.

Merci de ton aide encore une fois ! :)
Matware456
dimanche 21 juin 2009 à 20:31:20 | Re : Mettre un TBitmap en mémoire

Bacterius

Membre Club
"Ah ok je croyais que l'espérance de vie du fichiers mappé était limitée."

C'est ce que je viens d'expliquer, tu avais raison donc. N'y-a-t-il pas un problème dans ta phrase ?

Cordialement, Bacterius !

1 2

Cette discussion est classée dans : image, handle, mémoire, integer, tbitmap


Répondre à ce message

Sujets en rapport avec ce message

TBitmap et occupation mémoire [ par ThWilliam ] Bonjour à tous. <p class="MsoNorma Copie rapide d'image entre TBitmaps [ par zorg63 ] Désolé pour le tire qui n'est pas très clair, je ne savais pas comment résumer mon problème. Le voici :J'ai posté il y a quelques temps une source uti PB lecture et enregistrement d'image [ par trollnumber1 ] TrollBonjours,Jai un probleme quand je load mes images l'image n'apparait pas mes les hints s'affiche et je ne suis plus capable de faire du glisser d Affichage rapide d'image [ par zorg63 ] Désolé pour le tire qui n'est pas très clair, je ne savais pas comment résumer mon problème. Le voici :Je viens de poster une source utilisant l'affic comment affecter une bitmap a une image [ par didulle ] Salut tout le mondej'aimerais utilisé une variable de type bmp sur laquelle j'effectue des traitements. mais dés que je l'affecte à l'image il y a rie problème d'impression d'image XP [ par goloa ] Bonjour,alors je reviens à la charge avec ce problème qui me semblais avoir été résolu ... (en tout cas sous win2000 ça l'est) (voir http://www.delph Chargement d'images en masse depuis un TImagelist [ par Mr7Bungle ] Bonjour à tous , Je réalise un programme qui scan tout les dossiers d'un repertoire donné. Chaque dossier contient une image nommée "Folder.jpg" . En Problème de classe dans delphi [ par Ishizaki ] Hello tout le monde, voilà, j'ai un gros problème qui m'a foutu mon oral en l'air ce matin. En fait, j'ai fait un ptit programme sous delphi qui s'oc Interpreter et recuperer la premiere image d'une recherche Google [ par Yil2201 ] Salut! Je suis à la recherche d'un moyen de pouvoir, lorsque l'utilisateur tape l'artiste et l'album, rechercher la pochette sur Google. Mais voilà, j affichage d'images [ par guigui265 ] bonjour, j'ai un formulaire ou j'affiche une image que j'ouvre avec un openpicturedialog. je voudrais ensuite faire comme le fais l'afficheur de windo


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales