Utilisateur anonyme
-
26 févr. 2006 à 21:36
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 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.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 26 févr. 2006 à 23:20
salut francky,
oui je vois ce que tu veux faire blockread ne peut lire qu'à partir de
fichier disque là il te faut un memorystream et utilise les méthode
loadfromfile et savetofile
ces methodes sont attachées à la propriété picture du Timage
je te donne l'exemple delphi (il est pour un listbox mais la prrocedure est similaire pour un Tpicture
procedure TForm1.Button1Click(Sender: TObject);
var
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;
ListBox1.Items.SaveToStream(TempStream); // écrit le contenu de la boîte liste
// dans le flux
TempStream.Position := 0; // réinitialise la position au début du flux
RichEdit1.Lines.LoadFromStream( TempStream); // lit le contenu du flux dans le
// contrôle éditeur de texte formaté
TempStream.Free;
end;
soit pour un timage:
procedure TForm1.Button1Click(Sender: TObject);
var
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;
Image1.Picture.SaveToStream(TempStream); // écrit le contenu de l'image
// dans le flux
TempStream.Position := 0; // réinitialise la position au début du flux
Image2.picture.LoadFromStream( TempStream); // lit le contenu du flux dans la
// picture du second Timage
TempStream.Free;
end;
je n'ai pas tester mais je pense que cela fonctionne
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 26 févr. 2006 à 23:31
oui ce n'est que pour les fichiers disque.
cela dit tu peux enrigistrer sur le disque un copie binaire
de l'image (pas facile à réutiliser) pour cela tu
dois déclarer ton ficher sans type
blockread et blockwrite sont surtout utilisés pour lire et ecrire des
fichiers type record ou des fichiers binaires mais les méthodes
implémentées dans delphi ont réduit leur utilisation
Il me semble que quant tu fais ceci : BlockRead(Fichier, Buff, SizeOf(Buff),lu); tu lis bien le fichier (enfin la variable que tu as assigné au fichier) et tu "enregistre" le fichier dans un bloc mémoire (buff). Je voudrais faire de même mais au lieu d'etre un fichier c'est une image contenu dans un Timage
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 28 févr. 2006 à 12:42
Citation de Francky:,
----
<HR>
Et puis c'est important d'apprendre : alors même si ma question peut paraitre stupide, elle a le mérité de combler mon ignorance
<HR>
Bien dit Francky et c'est sans compter tous ceux qui attendent "tapis dans l'ombre" qu'une réponse soit donné pour parfaire leurs connaissances. De plus il est rare qu'il n'y ait qu'une seule solution à un problème, il est toujours intéressant de connaître une alternative et même si ce n'est pas utile dans l'immédiat ce n'est jamais en vain.
Donc posez des questions, c'est dans l'intérêt de tous.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 28 févr. 2006 à 21:23
Drjerome dans le 1ere cas, si tu fais comme tu dis et que tu
recharges une autre image dans le Tpicture (par un loadfromfile par
exemple)je ne suis pas sur que ton buffer pointe toujours sur l'image
initiale puisque dans ce cas je crois qu'il libère l'image initiale
avant de recharger la nouvelle.
en théorie cela devrait marcher à vérifier.
par contre en allant dans l'aide j'ai trouvé ceci:
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 28 févr. 2006 à 22:04
DrJerome les 2 méthodes ne sont pas équivalentes dans le cas d'un Move on fait une copie de la zone mémoire (une image en quelque sorte) dans la mémoire attribuée par getmem .Même
si l'image est détruite as copie restera (c'est pour celà qu'il faut
libérer la memoire par freemem
description donné par l'aide
"
procedure Move(const Source; var Dest; Count: Integer);
Description
Move copie Count octets de Source vers Dest. Aucune vérification
d'étendue n'est effectuée. Move effectue une compensation en fonction
du chevauchement entre les blocs source et destination.
"
La variable buffer est déclarée comme pointer sans type pour ne
pas avoir de problème de compatibilité de type (elle accepte tout type
de variable)
Dans le cas buffer:=@image1.Picture; on ne copie que l'adresse de l'image c'est un simple transtypage on fait pointer le buffer sur la variable.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 28 févr. 2006 à 22:22
j'ai pas testé mais chez moi Buffer^ n'est pas l'adresse du
buffer mais la zone mémoire sur laquelle il pointe ou alors je
n'ai rien compris au pointeurs! d'ailleurs si tu copie une image
compléte de plusieurs miliers d'octets dans un pointeur de 4
octets cela a des chances de....planter!
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 28 févr. 2006 à 22:34
Oui oui je confirme, dans ce cas, Buffer^ est un pointeur de 4 octets sur l'adresse mémoire et non la portion de mémoire occupée par l'image. Justement l'intérêt des pointeurs c'est pointer sur un objet, variable où une partie de mémoire ce qui a pour but d'accélérer considérablement les accès