Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

INSÉRER UNE IMAGE (BITMAP) DANS UN RICHEDIT (RXRICHEDIT)


Information sur la source

Catégorie :Trucs & Astuces Niveau : Débutant Date de création : 04/12/2002 Date de mise à jour : 04/12/2002 09:30:06 Vu : 11 278

Note :
6 / 10 - par 3 personnes
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

La fonction "BitmapToRtf" transforme une image bitmap en sa représentation Hexadécimale et ajoute les tags rtf.
La procédure "button1Click" utilise cette fonction et insère l'image dans le composant RxRichEdit (de la librairie RxLib).
 

Source

  • function BitmapToRtf(graph:TBitmap):string;
  • var
  • bi, bb, rtf:string;
  • bis, bbs:cardinal;
  • achar:ShortString;
  • HexGraph:string;
  • I:Integer;
  • begin
  • GetDIBSizes(graph.Handle, bis, bbs);
  • SetLength(bi,bis);
  • SetLength(bb,bbs);
  • GetDIB(graph.Handle, graph.Palette, PChar(bi)^, PChar(bb)^);
  • rtf:='{\rtf1 {\pict\dibitmap ';
  • SetLength(HexGraph,(Length(bb) + Length(bi)) * 2);
  • I:=2;
  • For bis:=1 to Length(bi) do
  • begin
  • achar:=Format('%x',[Integer(bi[bis])]);
  • if Length(achar)=1 then achar:='0'+achar;
  • HexGraph[I-1]:=achar[1];
  • HexGraph[I]:=achar[2];
  • Inc(I,2);
  • end;
  • For bbs:=1 to Length(bb) do
  • begin
  • achar:=Format('%x',[Integer(bb[bbs])]);
  • if Length(achar)=1 then achar:='0'+achar;
  • HexGraph[I-1]:=achar[1];
  • HexGraph[I]:=achar[2];
  • Inc(I,2);
  • end;
  • rtf:=rtf + HexGraph + ' }}';
  • Result:=rtf;
  • end;
  • procedure TForm1.Button1Click(Sender: TObject);
  • var
  • SS:TStringStream;
  • begin
  • SS:=TStringStream.Create(BitmapToRtf(Image1.Picture.Bitmap));
  • RxRichEdit1.PlainText:=False;
  • RxRichEdit1.StreamMode:=[smSelection];
  • RxRichEdit1.Lines.LoadFromStream(SS);
  • SS.Free;
  • end;
function BitmapToRtf(graph:TBitmap):string;
var
 bi, bb, rtf:string;
 bis, bbs:cardinal;
 achar:ShortString;
 HexGraph:string;
 I:Integer;
begin
 GetDIBSizes(graph.Handle, bis, bbs);
 SetLength(bi,bis);
 SetLength(bb,bbs);
 GetDIB(graph.Handle, graph.Palette, PChar(bi)^, PChar(bb)^);
 rtf:='{\rtf1 {\pict\dibitmap ';
 SetLength(HexGraph,(Length(bb) + Length(bi)) * 2);
 I:=2;
 For bis:=1 to Length(bi) do
 begin
  achar:=Format('%x',[Integer(bi[bis])]);
  if Length(achar)=1 then achar:='0'+achar;
  HexGraph[I-1]:=achar[1];
  HexGraph[I]:=achar[2];
  Inc(I,2);
 end;
 For bbs:=1 to Length(bb) do
 begin
  achar:=Format('%x',[Integer(bb[bbs])]);
  if Length(achar)=1 then achar:='0'+achar;
  HexGraph[I-1]:=achar[1];
  HexGraph[I]:=achar[2];
  Inc(I,2);
 end;
 rtf:=rtf + HexGraph + ' }}';
 Result:=rtf;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 SS:TStringStream;
begin
 SS:=TStringStream.Create(BitmapToRtf(Image1.Picture.Bitmap));
 RxRichEdit1.PlainText:=False;
 RxRichEdit1.StreamMode:=[smSelection];
 RxRichEdit1.Lines.LoadFromStream(SS);
 SS.Free;
end;

Commentaires et avis

signaler à un administrateur
Commentaire de Delphiprog le 04/12/2002 12:26:11 administrateur CS

Les deux lignes suivantes :
achar:=Format('%x',[Integer(bi[bis])]);
    if Length(achar)=1 then achar:='0'+achar;
pourraient être remplacées par :
achar := Format('%.2x', [Integer(bi[bis])]);
En effet, dans ce cas, on utilise l'indicateur de précision pour obtenir une chaine de deux caractères dans tous les cas et éviter un test.

Autre solution, utiliser la fonction IntToHex renvoyant une chaine  :
achar := IntToHex(Integer(bb[bbs]), 2);

signaler à un administrateur
Commentaire de Nebula le 04/12/2002 16:02:25

J'avais deja vu ce code sur SwissDelphiCenter, mais je suis à la recherche d'un code adapté au TRichEdit, ne pouvant pas utiliser le TRxRichEdit en raison de quelques bugs... Si quelqu'un sait ;-)

signaler à un administrateur
Commentaire de Frostizz le 04/12/2002 17:26:09

Tu peut utiliser le press-papier... Si tu utilise Notepad et ke tu copie un bitmap avec le copier-couper-coller tu peu le recoller...
Donc tu sauve le press-papier, tu copie ton image dans le presse-papier tu la colle dans ton richBox, et tu recharge le presse-papier original...
Mail moi aussi non -> Frostizz@Tuxfamily.org

signaler à un administrateur
Commentaire de Nebula le 05/12/2002 08:36:49

Justement ce qui m'intéresse c'est de le faire sans utiliser le presse-papiers :-/

signaler à un administrateur
Commentaire de copper le 31/07/2003 14:30:32

Très bon prog... J'ai utilisé la même technique (dibitmap) pour ajouter une image dans un document RTF malheureusement le fichier ne s'ouvre pas correctement sous Word 97 SR-2b (les images n'apparaissent pas) par contre le document s'ouvre correctement sous WordPad...

Quelqu'un a-t-il le même problème avec ce source?

signaler à un administrateur
Commentaire de subzero le 29/10/2003 16:44:51

Merci Spatul pour cette astuce! Elle m'a permis de concretiser un projet de tchat avec des smilies & détection d'url. Je me demandais si on pouvait faire pareil avec d'autres type d'objets, comme des cadres  par exemple... En fait, je recherche le moyen d'afficher plusieurs couleurs de fond dans le RxRichEdit, si vous pouviez m'aider, ce serait vraiment sympa! Merci, à+

signaler à un administrateur
Commentaire de subzero le 31/10/2003 11:29:35


Salut! J'ai trouvé le moyen pour intégrer des fichiers avec transparence! Cela engendre le fait que le fichier final est moins lourd, puisque les pixels trnasparents ne sont pas enregistrés dans le fichier. Je vais modifier votre code pour ajouter cette fonction, je vous avertis que ce sera au point! :-) à+

signaler à un administrateur
Commentaire de subzero le 31/10/2003 13:04:09

ARF!!! J'ai parlé trop vite je crois! En effet, la transparence est dispo que sur les GIFs, et il faut faire une convertion assez balaise, j'ai l"impression! Je passe par word pour récupérer le code RTF de l'image que j'insère tel quel... Je vais qu'en même essayer de trouver une solution, à+

signaler à un administrateur
Commentaire de Rubicode le 10/11/2004 11:33:40

Salut,
Pour que l'image soit enregistrée dans le fichier RTF, j'ai trouvé deux solutions:

if RxRichedit1 <> nil then
      if saveDialog1.execute then
      begin
            retx.streamMode:=[smPlainRtf];
           retx.Lines.SaveToFile(saveDialog1.fileName);
     end;

ou encore

if RETX <> nil then
      if saveDialog1.execute then
      begin
           retx.SelectAll;
           retx.Lines.SaveToFile(saveDialog1.fileName);
           retx.SetSelection(0,0,true);
      end;

signaler à un administrateur
Commentaire de Rubicode le 10/11/2004 11:39:56

Désolé,
Petite erreur, veuillez remplacer RxRichedit1 par RETX, dans le commentaire précédent.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,156 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.