Autore Topic: [RISOLTO]Ottenere una Picture da una DrawArea con la libreria libImlib2.so.1.4.6  (Letto 2554 volte)

Offline gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
Ho bisogno di un aiutino per risolvere questo problema:
utilizzando questo wiki: http://www.gambas-it.org/wiki/index.php?title=Generare_un_file_immagine_da_una_DrawingArea#Uso_delle_funzioni_esterne_del_API_di_X11_e_di_ImLib2
con: Uso delle funzioni esterne del API di X11 e di ImLib2
sono riuscito a salvare correttamente un DrawingArea su un file .png, e fin quì tutto bene  :ok:

Quello che mi serve, però, non è un'immagine salvata su disco, bensì una Picture (o Image) che devo inserire in una stampa di gambas.
Qualcuno mi può spiegare come posso generare un Picture utilizzando quel puntatore 'immago'
con i puntatori non sono mai andato molto d'accordo...  :hard:

credo mi serva una funzione della libreria "libImlib2.so.1.4.6", ma non so quale...

Un grazie anticipato  :ciao:
« Ultima modifica: 16 Dicembre 2016, 18:49:01 da gianfry56 »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ottenere una Picture da una DrawArea con la libreria libImlib2.so.1.4.6
« Risposta #1 il: 16 Dicembre 2016, 14:00:33 »
Ho bisogno di un aiutino per risolvere questo problema:
utilizzando questo wiki: http://www.gambas-it.org/wiki/index.php?title=Generare_un_file_immagine_da_una_DrawingArea#Uso_delle_funzioni_esterne_del_API_di_X11_e_di_ImLib2
con: Uso delle funzioni esterne del API di X11 e di ImLib2
sono riuscito a salvare correttamente un DrawingArea su un file .png, e fin quì tutto bene  :ok:

Quello che mi serve, però, non è un'immagine salvata su disco, bensì una Picture (o Image) che devo inserire in una stampa di gambas.
Qualcuno mi può spiegare come posso generare un Picture utilizzando quel puntatore 'immago'
con i puntatori non sono mai andato molto d'accordo...  :hard:

credo mi serva una funzione della libreria "libImlib2.so.1.4.6", ma non so quale...

Un grazie anticipato  :ciao:

Forse non ho capito (io non uso le librerie esterne) ma se tu hai il disegno sulla DrawingArea ti basta stampare da li.
Dai un'occhiata qui
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
Re:Ottenere una Picture da una DrawArea con la libreria libImlib2.so.1.4.6
« Risposta #2 il: 16 Dicembre 2016, 14:05:06 »
OK, Gianluigi, ma non devo stampare solo la DrawingArea... devo inserire l'immagine in un documento più complesso; ecco perché mi serve l'oggetto Picture.
In effetti al momento sto salvando l'immagine su /temp e la ricarico subito dopo
ma volevo capire se potevo evitare questo passaggio...  :-\

mi sembra strano che avendo a disposizione un puntatore che punta ad un'area di memoria che contiene un'immagine, non possa ottenere un oggetto Picture da quell'area di memoria per mezzo del puntatore... solo che non sono molto pratico di puntatori... :-\

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ottenere una Picture da una DrawArea con la libreria libImlib2.so.1.4.6
« Risposta #3 il: 16 Dicembre 2016, 14:14:00 »
Puoi disegnare direttamente in un'immagine oppure tramutare la DrawingArea in un'immagine.
Ripeto io di librerie e puntatori...
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
Re:Ottenere una Picture da una DrawArea con la libreria libImlib2.so.1.4.6
« Risposta #4 il: 16 Dicembre 2016, 14:19:28 »
Infatti 'quello' è il codice e il metodo che stò usando...

tentavo solo di 'elevare' un pochino le mie conoscenze  ;D
vediamo se qualcun'altro è ferrato in materia... magari chi ha fatto quella pagina del wiki  ;)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ottenere una Picture da una DrawArea con la libreria libImlib2.so.1.4.6
« Risposta #5 il: 16 Dicembre 2016, 18:24:28 »
Quello che mi serve, però, non è un'immagine salvata su disco, bensì una Picture (o Image)
Qualcuno mi può spiegare come posso generare un Picture utilizzando quel puntatore 'imago'

credo mi serva una funzione della libreria "libImlib2.so.1.4.6", ma non so quale...
Molto interessante la questione, ed anche molto tosta.
Ad ogni modo è più opportuno e... più agevole utilizzare delle due librerie, previste in quella pagina citata della WIKI, la libreria del sistema grafico X11.

Ne ho approfittato per creare una nuova pagina:
http://www.gambas-it.org/wiki/index.php?title=Passare_direttamente_ad_un_oggetto_Image_i_dati_grezzi_dei_pixel_di_una_DrawingArea_mediante_le_risorse_del_API_di_X11



con i puntatori non sono mai andato molto d'accordo...
Una variabile di tipo Puntatore non è altro che una normale variabile contenente l'indirizzo di memoria di una variabile primitiva, predefinita:
Codice: [Seleziona]
Dim i As Integer
  Dim p As Pointer

  i = 99

  p = VarPtr(i)

  Print p

oppure può contenere l'indirizzo della prima cella di memoria di un'area di memoria appositamente allocata dal programmatore:
Codice: [Seleziona]
Dim p As Pointer

  p = Alloc(SizeOf(gb.byte), 8)

  Print p

  Free(p)
« Ultima modifica: 17 Dicembre 2016, 01:33:49 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 gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
Re:Ottenere una Picture da una DrawArea con la libreria libImlib2.so.1.4.6
« Risposta #6 il: 16 Dicembre 2016, 18:48:45 »
Grande vuott !! :ok:
hai centrato in pieno la soluzione al problema.

il bello del forum... basta chiedere  ;D

Offline gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
vuott, forse ho messo "[RISOLTO]" con troppo entusiasmo ieri.... c'è un problema:
tutto funziona esclusa l'assegnazione della picture al PictureBox1

mi spiego meglio: se dopo la generazione dello stream inserisco questa riga:
Codice: [Seleziona]
im.Save("/tmp/prova.jpg", 100)
l'immagine viene salvata correttamente; quindi la procedura funziona.

ma se provo ad assegnare la picture al PictureBox1, questo resta vuoto!
Codice: [Seleziona]
PictureBox1.Picture = im.Picture

Questo proprio non me lo spiego...  :nono:

Non ho dubbi che tu abbia testato il codice... ma te lo chiedo lo stesso: a te funziona?

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Forse così?:
Codice: [Seleziona]
PictureBox1.Picture = Picture[im.Picture]

 ;D non mi sono accorto che mi era rimasto un Picture nella tastiera.
« Ultima modifica: 17 Dicembre 2016, 13:50:06 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
ma te lo chiedo lo stesso: a te funziona?
Sì funziona.

Stanotte, poi, ho riscritto la pagina della Wiki, che avevo già creato; ed ho inserito una seconda modalità più complessa che agisce su una risorsa presente in un file sorgente. Puoi cliccare sul collegamento sopra già riportato.
Ho riprovato entrambe le suddette modalità or ora stesso, e a me funzionano regolarmente.
Del resto se ti funziona nella creazione del file immagine, vuol dire che il procedimento di attribuzione dei dati grezzi, afferenti ai pixel del disegno presente sulla DrawingArea, è andato a buon fine.
Attenzione a non far sovrapporre la DrawingArea all'oggetto PictureBox.



Forse così?:
Codice: [Seleziona]
PictureBox1.Picture = Picture[im.Picture]
???
No, perché il proposito di gianfry56 è ora quello di caricare in PictureBox i dati di un oggetto Image che sia stato valorizzato dei grezzi, afferenti ai pixel della DrawingArea, in modo più diretto, ossia senza caricarli da un file immagine.
V'è da dire che la parte difficile di quei due codici Gambas, presentati nella pagina WIKI di cui sopra, non è - come si potrebbe pensare - quella con le funzioni esterne della libreria Libx11, bensì, quella del passaggio diretto - o meglio - della scrittura nell'area di memoria dell'oggetto Image dedicata alla conservazione dei dati grezzi dei pixel del disegno della DrawingArea.
In questo caso ho dovuto operare, seppur con le funzioni di Gambas, a livello più basso.

La tua soluzione prevede l'esistenza di un file immagine, del quale specificare lì il percorso.
« Ultima modifica: 17 Dicembre 2016, 15:26:46 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.244
  • Tonno verde
    • Mostra profilo

 ???
No, perché il proposito di gianfry56 è ora quello di caricare in PictureBox i dati di un oggetto Image che sia stato valorizzato dei grezzi, afferenti ai pixel della DrawingArea, in modo più diretto, ossia senza caricarli da un file immagine.

La tua soluzione prevede l'esistenza di un file immagine, del quale specificare lì il percorso.

Bravo, ti sei risposto da solo io ho visto un percorso e allora...

http://gambaswiki.org/wiki/comp/gb.qt4/picture/_get

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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Il Metodo .Picture della Classe Image, come è noto, è sufficiente e specifico per convertire una Image in una Picture.

Imponendo, però, quel comando all'interno delle parentesi quadre, come da te indicato, io ottengo un errore, visibile nel file immagine sotto allegato.
« 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.244
  • Tonno verde
    • Mostra profilo
Hai ragione il suggerimento è errato.
Ho sbagliato e chiedo scusa.
La prossima volta starò più attento.
L'ho dato perché ho visto un percorso (solo un percorso avendo visto male), non ho approfondito ed ero disattento in quanto questa discussione non mi interessa nello specifico.
In realtà volevo trovare il rimando alla documentazione e dare solo quello, ma non l'ho trovata subito e così...
Ben mi sta, la prossima volta quando vedo discussioni che esulano dai miei interessi evito di partecipare, promesso.

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

Offline gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
Del resto se ti funziona nella creazione del file immagine, vuol dire che il procedimento di attribuzione dei dati grezzi, afferenti ai pixel del disegno presente sulla DrawingArea, è andato a buon fine.
Infatti confermo: la procedura funziona e salva correttamente l'immagine.

Attenzione a non far sovrapporre la DrawingArea all'oggetto PictureBox.
Va ben tutto... ma proprio così pollo ?   ;D ;D ;D

Alla fine lascio [RISOLTO], perché effettivamente la procedura è corretta (almeno per quanto riguarda la generazione dell'immagine),
ma a me, personalmente, questa riga non funziona:
Codice: [Seleziona]
PictureBox1.Picture = im.Picture
ma almeno, temporaneamente, risolvo con il salvataggio e recupero dell'immagine.

Comunque resta il mistero  :hatecomputer: - Possibile che dipenda da una mia configurazione?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Va ben tutto... ma proprio così pollo ? 
A volte presunti bug o errori sono invece delle non volute distrazioni.   :-\



ma a me, personalmente, questa riga non funziona:
Codice: [Seleziona]
PictureBox1.Picture = im.Picture
Comunque resta il mistero  :hatecomputer: - Possibile che dipenda da una mia configurazione?
Fai una controprova: carica un file immagine in un oggetto Image; quindi caricati quei dati dall'oggetto Image in una PictureBox utilizzando quel medesimo comando.
Vedi se funziona.   :-\

Ad ogni buon fine, preciso che ho usato il Componente gb.qt4
« Ultima modifica: 17 Dicembre 2016, 17:57:35 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. »