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

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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



@+

jlen
3
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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



@+

jlen
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
26 févr. 2006 à 23:43
Salut Francky,
essaye ça :

procedure TForm1.Button2Click(Sender: TObject);
Var f : File of byte;
Buff : Array[0..2048] of Byte;
Total, Lu : Integer;
begin
Total := 0;
AssignFile(F ,'Asshole.jpg');
Reset(F);
Repeat
BlockRead(F, buff, SizeOf(Buff), Lu);
Inc(Total, Lu);
Until EOF(F);
CloseFile(F);
Label1.Caption : = IntToStr(Total);
end;

@+
Cirec
3
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 à 08:23
salut farncky,

tu peux aussi copier en mémoire une variable en utilisant les variables dynamiques et les pointeurs

var buffer: pointer;

procedure TForm1.Button1Click(Sender: TObject);

begin

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

move(image1.Picture,buffer^,sizeof(image1.Picture));//on transfert l'image

end;

ne pas oublier de libérer la mémoire par freemem;



il doit avoir encore d'autre façons de manipuler la mémoire!!



@+

jlen
3

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
26 févr. 2006 à 21:46
salut,

déjà si tu fait un blockread() tu n'écris l'image dans le buffer mais tu essayes de la lire.

pourquoi ne pas faire un savetofile:

Image1.picture.savetofile('nom du fichier)



@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
26 févr. 2006 à 21:47
ensuite image et le composant ;

l'image elle même est dans la propriété picture

@+

jlen
0
Utilisateur anonyme
26 févr. 2006 à 22:48
Salut Jlen,

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
0
Utilisateur anonyme
26 févr. 2006 à 23:22
Merci Jlen,

Je savais le faire avec les streams. Mais je voulais faire une petite application avec blockread.

Les blocks ce n'est que pour les fichiers ??
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
27 févr. 2006 à 08:58
C'est le "Asshole" qui décoiffe ! = smiley choqué

(je plaisante)

DrJerome
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 févr. 2006 à 11:23
La photo est mieux mais je ne peut pas la mettre ici

@+
Cirec
0
Utilisateur anonyme
28 févr. 2006 à 11:02
Merci 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 à 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.

@+
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 à 21:01
Et pourquoi pas utiliser directement @image1.picture ?

<HR>
buffer:pointer;
begin
buffer:=@image1.Picture;


<HR>

par exemple on peut réutiliser par la suite ainsi (transfert à une autre image) :

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

<HR>

(bien entendu on peut faire le classique : image2.Picture:=image1.Picture; )

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 à 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:

procedure TForm1.Button1Click(Sender: TObject);



var

BitMap1,BitMap2 : TBitMap;

begin

BitMap2 := TBitMap.Create;

BitMap1 := TBitMap.Create;

try

BitMap1.LoadFromFile('c:\Program Files\common Files\Borland Shared\Images\Splash\256color\factory.bmp');

BitMap2.Assign(BitMap1); // Copie BitMap1 dans BitMap2


BitMap2.Dormant;
// Libère les ressources GDI

BitMap2.FreeImage; // Libère la mémoire.

BitMap2.ReleaseHandle; // Avec cela on perd le bitmap;

finally

BitMap1.Free;

BitMap2.Free;

end;

end;

@+

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 à 21:50
C'est normal (idem pour la méthode "move") puisque ce ne sont que des pointeurs

(j'ai juste montré comment faire un "move" plus simple)

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 à 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.

@+

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:04
on peut aussi utiliser les "TPicture" avec "TPicture.Create" et "LoadFromFile" et/ou avec la méthode "assign"...tout est bon à prendre

DrJerome
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:11
Aaah, nos messages se croisent : quand tu dis :

"Dans le cas buffer:=@image1.Picture; on ne copie que l'adresse de l'image "

Je réponds mille fois oui ! Il ne s'agissait que de reproduire une variante de ton code.

Et quand tu fais un move sur un pointeur comme tu avais fait : IDEM !

J'avais testé ton code, l'image n'était pas conservée, si on change l'image de image1, ton pointeur changeait aussi son image.

Move doit s'utiliser sur 2 adresses différentes...ce que tu ne faisaits pas...

Désolé !

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 à 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!

@+

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 à 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

@+
Cirec
0
Rejoignez-nous