Mêttre une image dans un buffer

Résolu
Utilisateur anonyme - 26 févr. 2006 à 21:36
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 1 mars 2006 à 22:46
Salut à tous,

Je voulais mettre une image qui se trouve dans un Timage, dans un buffer

J'ai donc déclaré ma variable buff et fait
repeat
Blockread(image1, Buff, SizeOf(Buff), lu);

Manque de bol, l y a un probleme de compilation : "types imcompatibles" au niveau due image1. Si quelqu'un à une idée pour contourner cette difficulté de mmanière simple.

Merci à tous

46 réponses

DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
28 févr. 2006 à 22:36
Essaie ceci avec ton code "Move" :

tu prends un Image1 avec une image de ton choix dedans

tu fais ton code :

getmem(buffer,sizeof(image1.Picture));// on alloue la mémoire
move(image1.Picture,buffer^,sizeof(image1.Picture));//

tu changes l'image de ton image1 (par loadfromfile ou autre)

essaie dans un image2 (càd un deuxième TImage de ton form) de charger l'image de "buffer"...tu n'obtiens que la dernière image de image1 que tu as "loadée"

Il n'y a pas eu de réél "Move"

DJerome
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
28 févr. 2006 à 22:37
je viens de me mélanger les pinceaux :
Buffer est un pointeur de 4 Octets sur l'adresse mémoire
et
Buffer^ pointe sur la zone mémoire
Voilà

@+
Cirec
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
28 févr. 2006 à 22:41
Mais c'est normal ça reste toujours qu'un pointeur sur ....
et si entre temps tu change le contenu il va prendre en compte ce changement

@+
Cirec
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
28 févr. 2006 à 22:41
ça, on est tous d'accord dès le début

DrJerome
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
28 févr. 2006 à 22:50
Ouf Cirec tu m'avis mis le doute bon je peux me planter mais quand même
à ce point je commençais à m'inquièter (alhzeimer tu me guettes mais
attends encore un peu)

maintenant si tu relis mon post je n'ai jamais dit que l'opération
inverse était possible (d'ailleur si tu essaies un move dans l'autre
sens tu auras une spendide erreur de compilation) et ceci est tout à
fait normal puisquedans ce le compilateur considère que la variable
n'est pas assigné l'espace mémoire dans ce cas et
inconnu et tu essaie s tout simplement de modifier le
composant ... pas cool

Alors meintenant dit moi par quel miracle ou tout du moins quelle fonction tu as transferer buffer^ dans image.picture



@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
28 févr. 2006 à 22:54
cirec c'est effectivement un pointeur qui pointe sur une zone mémoire
dans laquelle tu as fait une copie de l'image qui ne change pas
quand tu changes l'image initiale par contre tu ne sais pas faire
l'opération inverse



@+

jlen
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
28 févr. 2006 à 22:55
Par :

image2.Picture:=TPicture(buffer^);

DrJerome
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
28 févr. 2006 à 23:16
et oui c'est vrai et c'est faux dans un
composant picture est un pointeur en fait on ne
fait que copier ....le pointeur wouaf wouaf tout le monde
avait raison :

djerome dans le fait que copier le pointeur effectivement ne change rien

moi dans le fait que j'ai bien fait une image du pointeur

reste maintenant à récupérer la zone mémoire pointée par picture bon on verra cela



@+

jlen
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
28 févr. 2006 à 23:18
Bon alors comme le dit DrJerome image2.Picture:=TPicture(buffer^); ça fonctionne
et je reviens à ce que disait avant tout comme DrJerome aussi :
le fait de faire un Move ne crée pas un nouvel espace mémoire mais il copie juste l'adresse
d'ailleurs si tu fais SizeOf(Image1.Picture) où SizeOf(Buffer) les deux sont égale à 4
et donc après un move si tu modifie l'image de Image1.Picture Buffer pointera sur la nouvelle Image

@+
Cirec
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
28 févr. 2006 à 23:32
d'accord avec toi move ne crée pas d'espace memoire c'est pour celà que l'on creer l'espace mémoire par getmem.

maintenant il faut caster et récuperer la taille de l'image.

je pense à instancesize mais je verrais ça demain maintenant à mes pinceaux!!



@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
1 mars 2006 à 08:10
la structure du Timage fait 44 octets mais le pointeur sur la zone
image n'est pas publiée et je n'ai trouvé aucune doc permettant de
connaitre sa position dans la structure .

En plus la portabilité n'est pas assurrée puisque cette structure peut variée d'une version de Delphi à l'autre

désolé



@+

jlen
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
1 mars 2006 à 10:35
C'est bizarre parceque le "Copy" des string(s) est un vrai copy (par rapport à Move, MoveMemory et CopyMemory)

C'est débile mais si on passe par des string(s) (qui sont des array de char par définition) ça marche avec la fonction "Copy"

"s"
est un string, "ps"
est un pstring :

<HR>
ps:=@image1.picture;
s:=copy(pstring(@image1.picture)^,1,Length(ps^));

<HR>

ce qui revient au même que :

<HR>
s:=copy(pstring(@image1.picture)^,1,Length(pstring(@image1.picture)^));

<HR>

pour récupérer l'image dans un autre TImage c'est :

<HR>
image2.Picture:=TPicture(s);

<HR>
Et si on recharge l'image de Image1, "s" n'est pas modifié.

C'est pas la solution à retenir, bien sûr, mais ça fait râler... pourquoi Ils n'ont pas inventé une vrai fonction Move.

DrJerome
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
1 mars 2006 à 10:41
sinon ceci marche

c'est un vrai Move, mais ce n'est pas la solution à retenir :

<HR>
MoveMemory(buffer,@image1.Picture,Length(pstring(image1.Picture)^));

<HR>

là le buffer est "stable"

DrJerome
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
1 mars 2006 à 10:44
ceci aussi marche rendant le buffer "stable" ou "autonome" :

<HR>
MoveMemory(buffer,@image1.Picture,sizeof(pchar(image1.Picture))^));

<HR>

DrJerome
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
1 mars 2006 à 10:46
PARDON : la solution c'est ceci :

<HR>
MoveMemory(buffer,@image1.Picture,sizeof(image1.Picture)^);

<HR>

DrJerome
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
1 mars 2006 à 10:48
ce qui revient au même que :

<HR>
Move(@image1.Picture,buffer,sizeof(image1.Picture)^);

<HR>

DrJerome
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
1 mars 2006 à 10:50
salut,

oui c'est quand même tout à fait surprenant.

ceci dit je suis d'accord avec toi c'est un exercice de style. il est quand même préférable de passer par un TMemoryStream



@+

jlen
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
1 mars 2006 à 10:52
Les 2 derniers codes que je vient d'écrire ne marchent pas, seul celui qui les précédaient marchaient, désolé j'ai eu un mélange entre 2 units dans mon projet...

DrJerome
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
1 mars 2006 à 11:04
j'ai vu--> erreur de compilation!!

autre chose étrange : MoveMemory est introuvable dans l'aide D7 (bien
qu'il complie sans problème) et dans D2005 c'est une routine 'C'

@+

jlen
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
1 mars 2006 à 11:08
MoveMemory c'est de l'Api (c'est dans l'aide API de Delphi, mais c'est kif-kif "Move")

DrJerome
0
Rejoignez-nous