Autore Topic: [Risolto o Quasi]Generare un file immagine da una DrawingArea  (Letto 1713 volte)

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
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:
Codice: [Seleziona]
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:
Codice: [Seleziona]
'' 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:
Codice: [Seleziona]
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
« Ultima modifica: 16 Ottobre 2017, 21:26:21 da vigiot »
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.114
  • Tonno verde
    • Mostra profilo
Re:Oibò il puntatore non ce lò !
« Risposta #1 il: 15 Ottobre 2017, 10:10:19 »
Non ti converrebbe salvare la DrawingArea direttamente in PDF?

 :ciao:

P.S. Cambia il titolo in relazione al contenuto in modo che sia utile in una futura ricerca, grazie.
« Ultima modifica: 15 Ottobre 2017, 10:11:50 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #2 il: 15 Ottobre 2017, 12:47:56 »
Ok fatto.
Mi interessa generare un'immagine poichè le dimensioni della mia Drawing sono di 600x850 pixel ed un pdf generalmente sono di 850x11169
quindi se ho una immagine poi la posso scalare di (600*1,3776,850*1,3776) mi dà come risultato una nuova immagine che riempie il "foglio" in A4
Dopodiché la posso trasformare con CairoPdfSurface  ;)
O almeno questa è la mia idea.
Ma se non ottengo il puntatore tutto il discorso va a ......... :'(
Grazie
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #3 il: 15 Ottobre 2017, 13:30:18 »
Innanzitutto vorrei capire alcune cose:

1) Il tuo sistema operativo è a 32-bit o a 64-bit ?

2) Quale distribuzione hai di Linux ?

3) Quale Componente grafico (gb.gtk, gb.qt4, etc...) hai attivato ?
« Ultima modifica: 15 Ottobre 2017, 13:49:45 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #4 il: 15 Ottobre 2017, 13:55:23 »
Debian versione 9.8  Amd 64 con Gambas 3.5.
componente attivato gb.qt4
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #5 il: 15 Ottobre 2017, 14:07:37 »
Il problema da te sollevato è capitato anche a qualche altro programmatore.
Uno di loro risolse cambiando l'identificatore di enumeratore all'ultimo parametro attuale della funzione esterna " XGetImage( ) ".

In sostanza devi provare a sostituire l'identificatore " ZPixmap " (usato nell'esempio in Wiki) con " XYPixmap ".
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.114
  • Tonno verde
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #6 il: 15 Ottobre 2017, 14:33:11 »
...
quindi se ho una immagine poi la posso scalare ...

Non puoi scalare il disegno e poi stamparlo in PDF? Ti ricordo che esiste Paint.Scale  :-\

Dai un'occhiata a questa lezione

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #7 il: 15 Ottobre 2017, 14:48:24 »
Wow !!! :2birre:
Questa lezione è mooolto interessante di sicuro  ci provo. :ok:
Ma per correttezza proverò anche le modifiche suggerite da vuott  8)
Appena posso farò sapere ...
Grazie  :ciao: :ciao:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #8 il: 15 Ottobre 2017, 16:05:06 »
Potrebbe anche agire calibrando in sintonia opportunamente i parametri del metodo " .DrawImage( ) " della Classe ''Paint'' e della proprietà " .Resolution " della Classe Printer.

Infatti, facendo una prova, sono riuscito a far disegnare sull'intera pagina (di dimensioni A4) di un file PDF, una piccola immagine avente all'origine le dimensioni 150x150 pixel.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #9 il: 16 Ottobre 2017, 00:43:25 »
Mi spiace ma non funzionano entrambi.  :hatecomputer: :hatecomputer:
 Volevo postare il codice intero (sarebbe interessante provarlo su di un'altra distribuzione)
ma è troppo lungo! supera i 20000 caratteri ammessi
Perché se funziona è colpa mia altrimenti (magari) di qualche libreria ...
Come posso fare? 

Grazie se vorrete provarci
io intanto ... :specchio:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #10 il: 16 Ottobre 2017, 00:48:16 »
Ho effettuato la prova con il codice da te postato, ebbene ora anche a me viene sollevato quell'errore.
E' dunque evidente che c'è qualcosa che va in conflitto con la funzione esterna di X11.
« Ultima modifica: 16 Ottobre 2017, 01:33:24 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #11 il: 16 Ottobre 2017, 02:14:27 »
Risolto !    :D

Il problema sta nell'espressione: Me.Height = 550 .
In particolare il valore assegnato alla proprietà " .Height " del Form è inferiore al valore assegnato alla medesima proprietà della DrawingArea.

Conservando i valori originali della DrawingArea da te impostati, per eliminare l'errore ho dovuto assegnare alla proprietà "Me.Height" il valore 880.

Va precisato che è necessario anche re-impostare l'ultimo parametro attuale della funzione esterna " XGetImage( ) " con l'identificatore di enumeratore presente nell'esempio della nostra Wiki, ossia: ZPixmap .
« Ultima modifica: 16 Ottobre 2017, 02:20:31 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.114
  • Tonno verde
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #12 il: 16 Ottobre 2017, 09:56:29 »
Mi spiace ma non funzionano entrambi.  :hatecomputer: :hatecomputer:
 Volevo postare il codice intero (sarebbe interessante provarlo su di un'altra distribuzione)
ma è troppo lungo! supera i 20000 caratteri ammessi
Perché se funziona è colpa mia altrimenti (magari) di qualche libreria ...
Come posso fare? 

Grazie se vorrete provarci
io intanto ... :specchio:

Menu Progetto > Crea > Pacchetto sorgenti...(Ctrl+Alt+A) e poi alleghi il progetto Gambas compresso.

 :ciao:
« Ultima modifica: 16 Ottobre 2017, 09:57:02 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #13 il: 16 Ottobre 2017, 16:04:10 »
Non sapevo che si potesse compattare il codice  :-[ :-[
e nella confusione ho aperto un nuovo post. Scusate.
Ma il motivo per cui l'altezza del MainForm è settata a 550 e per problemi di risoluzione del laptop
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein

Offline vigiot

  • Gambero
  • **
  • Post: 75
    • Mostra profilo
Re:Generare un file immagine da una DrawingArea
« Risposta #14 il: 16 Ottobre 2017, 16:08:13 »
Scusa vuott ma a furia di prove devo aver fatto pasticci.
Quello a cui ti riferisci è:

Codice: [Seleziona]
 XImage = XGetImage(dsp, DwgArea1.Handle, 0, 0, DwgArea1.W, DwgArea1.H, XAllPlanes(), ZPixmap)

perché se è cosi mi da ancora errore .... :hatecomputer:
Siamo tutti ignoranti, ma fortunatamente non della stessa cosa. Albert Einstein