Salve, eccomi di nuovo
Problemino, vorrei convertire una DrawinArea in Immagine per poi salvarla in pdf.
nel wiki ho trovato : Generare un file immagine da una DrawingArea se non ricordo male da vuotto (che profondamente ringrazio .. :D)
ho inserito i codici:
Library "libX11:6.3.0"
Private Enum XYBitmap = 0, XYPixmap, ZPixmap
Private Extern XOpenDisplay(display_name As String) As Pointer
Private Extern XAllPlanes() As Long
Private Extern XGetImage(display As Pointer, d As Long, xI As Integer, yI As Integer, wid As Integer, hei As Integer, plane_mask As Long, formatI As Integer) As Pointer
Private Extern XCloseDisplay(display As Pointer)
e poi:
'' Creazione di un'immagine della DrawingArea
Private Sub Crea_Immagine()
Dim dsp, XImage, dati_imm As Pointer
Dim im As Image
Dim st As Stream
Dim i As Integer
dsp = XOpenDisplay(Null)
If dsp = 0 Then Error.Raise("Impossibile aprire una connessione al server X!")
XImage = XGetImage(dsp, DwgArea1.Handle, 0, 0, DwgArea1.W, DwgArea1.H, XAllPlanes(), ZPixmap)
If XImage = 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine della DrawingArea !")
dati_imm = Pointer@(XImage + 16)
im = New Image(DwgArea1.W, DwgArea1.H)
If IsNull(im) Then Error.Raise("Impossibile creare un oggetto 'Image' !")
st = Memory im.Data For Write
For i = 0 To im.W * im.H * Len(im.Format)
Write #st, Byte@(dati_imm + i) As Byte
Next
st.Close
im.Save("/home/franco/Test_Gambas/Casa_Serena/DwgArea1.png", 100)
XCloseDisplay(dsp)
End
Ma qui mi sono arreso poiché mi dà questo errore:
If XImage = 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine della DrawingArea !")
Ovviamente non ho la più pallida idea di come risolverlo. :-\
Uso Gambas3 ver. 3.5 su Debian 8.9
aiutino ... :'(
Grazie
Scusa vuott ma a furia di prove devo aver fatto pasticci.
Quello a cui ti riferisci è:
XImage = XGetImage(dsp, DwgArea1.Handle, 0, 0, DwgArea1.W, DwgArea1.H, XAllPlanes(), ZPixmap)
perché se è cosi mi da ancora errore .... :hatecomputer:
Quasi risolto ...
per generare l'immagine ho provato ...
Private Sub Crea_Immagine()
Dim im As Image
' Crea un'immagine delle medesime dimensioni della "DrawingArea"
' le disegna usando le stesse routine per la drawing ...
im = New Image(DwgArea1.Width, DwgArea1.Height, Color.White)
Modulo_Base(im)
Scrivi_Data(im)
Scrivi_Mese(im)
im.Save("/home/franco/Scrivania/test.png", 100)
End
Per farne un pdf ..
Private Sub Crea_Pdf()
Dim im As Image
pdf = New CairoPdfSurface("/home/franco/Scrivania/test.pdf", 210.0, 297.0, "1.5")
Cairo.Begin(pdf)
im = Image.Load("/home/franco/Scrivania/test.png")
Cairo.Scale(1, 1)
Cairo.Source = Cairo.ImagePattern(im, 10, 10)
Cairo.PaintPrivate Sub Crea_Immagine()
Cairo.ShowPage
Cairo.End
End
Ovviamente ho dovuto modificare le sub in modo che Paint.Begin() accettasse un diverso Object a seconda dei casi.
In effetti il pdf lo crea ma..... risulta corrotto quando tenti di visualizzarlo
Santa Polenta ! :'( :'(
.... ritentiamo ...
Per me la considero una fortuna che qualcun'altro possa esaminare il codice.
Serve a migliorarsi. :D
per quanto riguarda la "trasformazione" sono partito da qui:
const char *filename = g_strconcat(archivio_pdf_anno_corrente, "/fattura_", numero_fattura_text, NULL);
print_pdf = true;
GdkPixbuf *image_2;
GdkPixbuf *image_2_gs;
cairo_surface_t *surface;
cairo_t *cr1;
cairo_t *cr2;
int widht = 596 , height = 843;
surface = cairo_pdf_surface_create(filename, widht, height);
cairo_pdf_surface_restrict_to_version(surface, CAIRO_PDF_VERSION_1_5);
//cout<<"Surface..."<<cairo_status_to_string(cairo_surface_status(surface))<<endl;
cr1 = cairo_create(surface);
cr2 = cairo_create(surface);
//cout<<"Prima pagina "<<cairo_status_to_string(cairo_status(cr1))<<endl;
//cout<<"Seconda pagina "<<cairo_status_to_string(cairo_status(cr2))<<endl;
drawing_model_part_zero(cr1);
if (abbiamo_bollo) {
// l'immagine del bollo
image_2 = gdk_pixbuf_new_from_xpm_data((const char **)bollo_xpm);
gdk_cairo_set_source_pixbuf(cr1, image_2, 430, 8);
cairo_rectangle(cr1,430, 8, 134, 89);
cairo_fill(cr1);
g_object_unref(image_2);
};
drawing_model_part_one(cr1);
if (abbiamo_cliente) {
drawing_model_part_two(cr1);
};
cairo_show_page(cr1);
// seconda pagina
if (abbiamo_bollo) {
// l'immagine del bollo
image_2_gs = gdk_pixbuf_new_from_xpm_data((const char **)bollo_gs_xpm);
gdk_cairo_set_source_pixbuf(cr2, image_2_gs, 415, 8);
cairo_rectangle(cr2,415, 8, 171, 114);
cairo_fill(cr2);
g_object_unref(image_2_gs);
};
seconda_pagina = true;
drawing_model_part_zero(cr2);
drawing_model_part_one(cr2);
drawing_model_part_two(cr2);
cairo_show_page(cr2);
cairo_surface_destroy(surface);
cairo_destroy(cr1);
cairo_destroy(cr2);
seconda_pagina = false;
cout<<"Il file \""<<filename<<"\" è stato scritto correttamente"<<endl;
print_pdf = false;
C'è da dire che per le operazioni di disegno viene usato cairo e non paint.
un istruzione in cairo per dare un riferimento es.: cairo_move_to (cr,10,10)
qui verrebbe tradotta in : Paint.MoveTo(10,10)
perché l'oggetto in cui vai ad agire lo hai già impostato con Paint.Begin(oggetto_su_cui_disegnare)
Quindi anche modificando sub Es.: Disegna() con Disegna(obj AS Object)
e di conseguenza la chiamata diveniva Disegna(DrawingArea1) per la DwgArea
o Disegna(pdf) per il pdf appunto (Dim pdf As CairoPdfSurface)
Purtroppo non funzionano allo stesso modo! :hatecomputer:
ciao :ciao: