begin process at 2010 02 10 12:07:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Système

 > 

Mémoire

 > 

Modifier les octets d'un objet


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

Modifier les octets d'un objet

mardi 23 juin 2009 à 17:37:23 | Modifier les octets d'un objet

Matware456

Salut, c'est encore moi ! ^^

Voilà maintenant que j'ai enfin réussi à stocker mon Bitmap dans un fichier mappé, je cherche maintenant à modifier les bytes de mon objet image pour pouvoir l'afficher, j'utilise ce code :

CopyMemory(@image,MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,(320*240*3)+56),(320*240*3)+56);
Mais il ne fonctionne pas... Pourtant je crois que tout est en règle mais j'obtiens une EAccessViolation. =/
Merci d'avance pour votre aide !

Matware456
mardi 23 juin 2009 à 19:13:24 | Re : Modifier les octets d'un objet

Guillemouze

Réponse acceptée !
c'est quoi ton "image"? un TImage, un TBitmap, un buffer (genre issu de ScanLine), ... ?

Je pense que ecrire directement un objet n'est pas terrible (voir impossible). Notament un TBitmap qui repose sur un handle, donc géré par Windows.
En supposant que tu utilise un TBitmap, ce que je te conseille de faire, c'est de
- sauver ton bitmap dans un TMemoryStream (TBitmap.SaveToStream(...)),
-d'enregistrer ce stream dans ton fichier map
pour l'ecriture, et l'inverse pour la lecture:
- charger ton fichier map dans un stream
- charger ton bitmap despuis ce stream (TBitmap.LoadFromStream(...)).

mardi 23 juin 2009 à 19:16:15 | Re : Modifier les octets d'un objet

Matware456

Oui c'était un TImage, je vais essayer avec ta méthode ! Merci pour ton aide ! :)
mardi 23 juin 2009 à 20:44:44 | Re : Modifier les octets d'un objet

Matware456

Çà fonctionne mais partiellement, je n'arrive pas à déplacer les octets du fichier mappé vers le TMemoryStream, mon CopyMemory :
CopyMemory(mem.Memory,MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0),307254);
Ne marche pas, et ceci non plus :
mem.Write(MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0)^,307254);
Et je n'arrive pas appeler la fonction SetPointer...
mardi 23 juin 2009 à 22:02:00 | Re : Modifier les octets d'un objet

Guillemouze

Réponse acceptée !
essaye de voir si ca marche en passant par un buffer temporaire
const
  MAP_SIZE = 307254;
var
  buff: array[0..MAP_SIZE-1] of byte;
  m: pointer;
begin
  m := MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  if m = nil then
    raise Exception.Create('pb obtention map');

  CopyMemory(@buff[0], m); //apres ca tu peux evaluer buff pour voir si ce qu'il y a dedans semble correct
  mem.write(buff[0], MAP_SIZE); 
end;

mercredi 24 juin 2009 à 22:44:08 | Re : Modifier les octets d'un objet

Matware456

Yeah, ça marche : Guillemouze, t'es un dieu ! =D

Par contre ya un truc qui m'échappe maintenant, le fichier mappé s'efface dès que je ferme l'application alors qu'il devrait rester en mémoire, ça marchait pourtant avant, et tout d'un coup, je me retrouve avec un GetLastError qui renvoie 2 (fichier introuvable), peux-tu, une dernière fois, m'aider à retrouver ce fichier mappé ?

Merci énormément pour ton aide,
Matware456
jeudi 25 juin 2009 à 00:34:16 | Re : Modifier les octets d'un objet

Guillemouze

"Guillemouze, t'es un dieu" En fait je suis juste son prophete. Le "patron" prefere rester anonyme

Alors la, bonne question. Il me semble que le fichier est detruit quand tu fais CloseMapHandle ou un truc du genre. Mais a mon avis, Windows tient une liste des applications qui on ce MapFile ouvert. Si il sont tous fermés, je pense qu'il detruit le MapFile. Sinon, tu risquerai de te retrouver avec un paquet de memoire perdue si les applications ne liberent pas la memoire (de la meme maniere que quand tu termine un exe, windows libere automatiquement la memoire allouée par celui-ci)
jeudi 25 juin 2009 à 10:29:17 | Re : Modifier les octets d'un objet

cirec

Membre Club Administrateur CodeS-SourceS
Salut,

si le fichier n'est plus disponible c'est que toutes les applications qui l'utilisait ont fermée le Handle :

"A shared file mapping object will not be destroyed until all processes that use it close their handles to it by using the CloseHandle function."

voir MSDN: http://msdn.microsoft.com/en-us/library/aa366878(VS.85).aspx

 
@+
Cirec

jeudi 25 juin 2009 à 16:59:16 | Re : Modifier les octets d'un objet

Matware456

Je ferme le Handle uniquement lorsque j'affiche mon fichier mappé, si je ne fais que stocker l'image dans le fichier puis fermer le processus et ensuite essayer de voir le fichier, ça ne marche pas...
Pourtant je ne passe pas par un CloseHandle, Delphi le fait-il automatiquement ?
vendredi 26 juin 2009 à 11:36:46 | Re : Modifier les octets d'un objet

cirec

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
ben je suppose que oui, pas de certitude mais ça semblerait logique sinon si l'application plante le fichier resterait à chaque fois dans la mémoire
voir le message de Guillemouze du jeudi 25 juin 2009 à 00:34:16

 
@+
Cirec


1 2

Cette discussion est classée dans : objet, image, modifier, octets, maintenant


Répondre à ce message

Sujets en rapport avec ce message

Coller une image dans un objet tdbimage [ par famjerom ] J'ai créé une base de donnée SQL SERVER. Une table contient une image (type image ou varbinary) affichée à l'aide de l'objet VCL TDBImage de Delphi 20 Modifier taille bitmap [ par seba31stien ] Bonjour, dans mon appli, je charge une carte au format bitmap dans un paintbox. Cependant, la procédure StretchDraw : Paintbox1.canvas.StretchDraw( Afficher une image svg dans un objet fximage [ par ludo2223 ] Bonjour,Je souhaite afficher une image au format SVG dans un composant fximage sous Delphi 7. Comment faut-il s'y prendre ?Existe-il un composant qui déplacement d'une image dans un objet Timage [ par ninaleo ] Bonsoir tout le monde    J'ai un petit problème pour lequel je ne trouve pas  de solution évidente et j'aimerais vous le soumettre.    J'ai un objet T Modifier la valeur d'un pixel dans une image au formta FITS [ par faymarcel ] Bonjour à tous,But : application en Imagerie astronomiqueComment s'y prendre pour changer la (les) valeur(s) numérique de pixel(s) à l'adresse x,y, da modification d'image [ par 365tib ] Bonjours,J'ai un petit probleme pour modifier une image pixel par pixel, quand j'execute le prog, on me renvoie "ne peut modifier une Image que si ell Déplacement d'un objet dans un TPageControl [ par retaks666 ] Bonjour, j'ai développé une form, y ai ajouté des composants, boutons, textbox etc, et j'aimerai implémenter un système de pagecontrol. Comment puis-j Pb Dessin sur Image [ par Jean_Jean ] Bonsoir, J'ai l'impression que je ne place pas le code où il faut. L'évènement o gestion des photos dans une base de donnée [ par kadje84 ] Je suis débutant en delphi et j'ai conçu une base de donnée sous paradox dont un des champs est de type graphic et doit contenir des photos.j'aimerai Redimensionner un composant du haut vers le bas [ par mecsympa ] Pour un programme, j'ai besoin de redimensionner une image. Mais si j'utilise height (ou width) l'image se reduit du bas vers le haut. Je voudrais fai


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,624 sec (4)

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