Mêttre une image dans un buffer [Résolu]

- - Dernière réponse : jlen100
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
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
Afficher la suite 

Votre réponse

20/46 réponses

Meilleure réponse
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de jlen100
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de jlen100
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de jlen100
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
0
Merci
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
Commenter la réponse de jlen100
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
0
Merci
ensuite image et le composant ;

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

@+

jlen
Commenter la réponse de jlen100
0
Merci
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
Commenter la réponse de Utilisateur anonyme
0
Merci
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 ??
Commenter la réponse de Utilisateur anonyme
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
0
Merci
C'est le "Asshole" qui décoiffe ! = smiley choqué

(je plaisante)

DrJerome
Commenter la réponse de DRJEROME
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
La photo est mieux mais je ne peut pas la mettre ici

@+
Cirec
Commenter la réponse de Cirec
Commenter la réponse de Utilisateur anonyme
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
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
Commenter la réponse de Cirec
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
0
Merci
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
Commenter la réponse de DRJEROME
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
0
Merci
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
Commenter la réponse de jlen100
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
0
Merci
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
Commenter la réponse de DRJEROME
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
0
Merci
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
Commenter la réponse de jlen100
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
0
Merci
on peut aussi utiliser les "TPicture" avec "TPicture.Create" et "LoadFromFile" et/ou avec la méthode "assign"...tout est bon à prendre

DrJerome
Commenter la réponse de DRJEROME
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
0
Merci
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
Commenter la réponse de DRJEROME
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
0
Merci
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
Commenter la réponse de jlen100
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
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
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.