Sauvegarder du texte en jpg

Résolu
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008 - 15 mai 2006 à 17:04
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008 - 19 mai 2006 à 16:03
Bonjour,



je travaille en Delphi 6.

J'ai un RicheEdit, dans lequel je copie du texte =>REdTxtJoint.PasteFromClipboard;



Cependant, je voudrais enregistrer ce texte au format image du genre montexte.jpg.



Je ne sais pas comment récupérer mon texte et le convertir en image.



Avez-vous une idée ou un site qui pourrais m'aider.



UN TOUT GRAND MERCI


CSweety13

15 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
15 mai 2006 à 18:43
salut,

tu peux envoyer ton texte dans un bitmap en utilisant un scanline qui
te permets d'accéder à la matrice et ensuite tu peux sauver ton bitmap
en jpeg

(je ne vois tas très bien ce que cela vas donner ...)

maintenant si tu veux sauver ton texte sous forme d'une image écris directement dans les canvas d' un bitmap en utilisant un

Bitmap.Canvas.TextOut(N°de colonne,N°Ligne,'Mon Texte') et ensuite tu sauves en jpeg



@+

jlen
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
15 mai 2006 à 19:25
Salut,

Voici un petit exemple qui permet de sauvegarder la partie visible du texte d'un RichEdit

procedure TForm1.Button1Click(Sender: TObject);
Var TmpBmp : TBitmap;
Begin
TmpBmp := TBitmap.Create;
With TmpBmp Do
Try
Width : = RichEdit1.Width;
Height:= RichEdit1.Height;
BitBlt(Canvas.Handle, 0, 0, Width, Height, Form1.Canvas.Handle, RichEdit1.Left, RichEdit1.Top, srcCopy);
TmpBmp.SaveToFile('RichEdit.bmp');
Finally
TmpBmp.Free;
End;
End;

@+
Cirec
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
18 mai 2006 à 23:05
Salut CSweety13,

Va voir ici : Saving a RichEdit to a Metafile

Ce code génial permet de sauver le contenu d'un TRichEdit dans un fichier image de type Metafile (*.EMF).
Je n'ai pas eu le temps de tout comprendre, mais ça fonctionne du tonnerre de Zeus...

Bonne prog'

[mailto:j@pee j@pee]
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
18 mai 2006 à 23:35
ça y est j'ai trouvé :

ajouter dans la procédure :
procedure DumpRTFToPagedEMFs(hWndRTFControl : HWND; szEMFFileTitleBase : LPTSTR);
var
  szMetaName : string;
  nRTFTextLength, nStart, nPage : integer;
  hRefDC : HDC;
  rcMeta : TRECT;
  hEMF :   HENHMETAFILE;



begin

    // First, determine how many chars are in the RTF
    nRTFTextLength := GetRTFTextLength( hWndRTFControl );
    // Get a reference DC (based on a printer)
    hRefDC := GetPrinterDC();
    If hRefDC = 0 Then Exit;   // ajouter cette ligne et c'est bon
    // Set up the meta RECT for 0.01mm units














@+
Cirec
3

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

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
16 mai 2006 à 13:33
<!--StartFragment -->


Hi,


Je n'ai pas mieux que la méthode de Cirec...
L'inconvénient majeur de cette manière de procéder est qu'il ne faut pas qu'une application "stay on top" recouvre le RichEdit au moment de la capture.
Pour convertir le Bmp en fichier Jpeg, voici une petite procedure simple et efficace.

uses Jpeg;

procedure SaveBmpToJpegFile(const Bmp: TBitmap; const FileName: TFileName);
const
TauxCompressionJpg = 100;
begin
with TJPEGImage.Create do
try
CompressionQuality : = TauxCompressionJpg;
Assign(Bmp);
SaveToFile(FileName);
finally
Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var TmpBmp: TBitmap;
begin
TmpBmp := TBitmap.Create;
with TmpBmp do
try
Width : = RichEdit1.Width;
Height:= RichEdit1.Height;
BitBlt(Canvas.Handle, 0, 0, Width, Height, Form1.Canvas.Handle, RichEdit1.Left, RichEdit1.Top, srcCopy);
//SaveToFile('RichEdit.bmp');
SaveBmpToJpegFile(TmpBmp, 'RichEdit.jpg'); // <- avant Free
finally
Free;
end;
end;

Bonne prog'

j@pee
0
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008
17 mai 2006 à 11:24
Bonjour et merci pour vos réponses.


j'ai bien essayé avec la fonction BitBlt. cela fonctionne.

Mais il me reste un soucis : c'est que le richtext peut contenir un
texte relativement grand et ainsi déclencher ainsi les scrollbar.

Avec la fonction BitBlt, il ne me récupère que la partie visible du texte du richtext.


Cette méthode-là ne me satisfait donc que temporairement


merci encore!

CSweety13
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
17 mai 2006 à 11:54
Si tu veux un complément d'aide, peux-tu préciser :

- pourquoi ne pas récupérer le texte dans au format txt, doc ou autre ?

et sinon :

- pourquoi vouloir récupérer le texte au format jpg,
- la taille de cette image jpg,
- le texte est-il n'est-il pas susceptible de déborder du format de cette image ?

Bonne prog'
0
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008
17 mai 2006 à 12:00
Japee,


J'ai besoin de récupérer mon texte FORMATE en image, car ensuite je
dois l'imprimer en tant qu'image. (la référence au fichier image se
fait dans un fichier XML).


La taille de l'image doit être dépendante de la taille du texte, le
richedit s'ajustant automatiquement avec les scrollbox au texte qui est
à l'interieur.

J'espère avoir été assez claire...

CSweety13
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
18 mai 2006 à 23:30
@ Japee :

super ce code, c'est vraiment génial (à étudier absolument)

Un petit bug toute fois (qui peut devenir gros)
Si au moment de la selection de l'imprimante tu cliques sur Annuler tu te retrouves avec des centaines de fichiers *.emf, de quelques octets, (j'en ai moi même eu 1113) mais si on choisi Ok alors tout est Ok

Si quelqu'un trouve pourquoi ...

@+
Cirec
0
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008
19 mai 2006 à 14:22
C'est génial!!!



J'ai presque tout compris sauf la partie où tu fais appel à la fonction PrintDlg por avoir un HDC.


Est-ce pour avoir la taille et la résolution standard pour l'impression ?



Pourrait-on utiliser juste un CreateDC ou utiliser un DC existant ?


CSweety13
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
19 mai 2006 à 14:47
Salut,

Alors essaye en modifiant le code comme ceci (Toujours dans la même procédure):

    // First, determine how many chars are in the RTF
    nRTFTextLength := GetRTFTextLength( hWndRTFControl );
    // Get a reference DC (based on a printer)
    //hRefDC := GetPrinterDC();        <------ Mettre cette ligne en commentaire
    // Get a reference DC         
    hRefDC : = CreateDC('DISPLAY', Nil, Nil, Nil);       <-----  et ajouter celle-ci
    If hRefDC = 0 Then Exit;

Voila et le PrinterDialog ne s'affiche plus

@+
Cirec
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
19 mai 2006 à 15:32
ps : ne pas oublier de liberer le Dc qui a été crée:

        // clean up
        DeleteEnhMetaFile( hEMF );
        inc(nPage);
        if nStart = 0 then
         break;
    end;
    DeleteDc(hRefDC);     // <----------- Ajouter cette ligne
end;

@+
Cirec
0
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008
19 mai 2006 à 15:35
merci beaucoup pour ton aide...


J'ai bien vite avancé!!! 

CSweety13
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
19 mai 2006 à 15:53
Il faut surtout remercier Japee pour avoir mis la main sur ce code qui est absolument génial,
je n'ai fais que corriger un oubli de l'auteur et une petite modification pour ne plus avoir le PrinterDialog,
mais ça c'est facile à faire quand le gros du code tourne correctement

En tout cas ce petit bout de code ouvre de nouvelles possibilités ...
















@+
Cirec
0
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008
19 mai 2006 à 16:03
Et quelles possibilités!!!...

CSweety13
0
Rejoignez-nous