Gambas-it

Gambas3 => Domande tecniche => Topic aperto da: Top Fuel - 04 Novembre 2014, 17:42:07

Titolo: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 04 Novembre 2014, 17:42:07
Dopo la Gridview ci voleva anche la PictureBox... >:(
C'è una PictureBox vuota sul form, perchè questo semplice codice non mi fa vedere nulla?

Codice: [Seleziona]
' Gambas class file

Private imm As New Image
Private pic As New Picture

Public Sub FMain()
imm = Image.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")
pic = imm.Picture
With foto
   .W = imm.W
   .H = imm.H
   .Picture = pic
End With
End

Eppure è tutta roba che ho preso dalla Wiki...
Notare che anche facendo

Codice: [Seleziona]
.Picture = Picture.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")

Non cambia nulla. :-\
Titolo: Re: PictureBox riottosa
Inserito da: Picavbg - 04 Novembre 2014, 19:09:04
Ho fatto qualche prova ed ho notato che l'istruzione di caricamento della picture, inserita nella Sub FMain non produce effetti, mentre, se la inserisci nella Sub _new, oppure nella Sub Mouse_down produce effetti diversi. Infatti, se posta nella Sub _new, l'immagine compare subito con l'apertura della Form. Se invece la inserisci nella  Sub Mouse_down  l'immagine viene mostrata non appena clicchi sul mouse, quando il cursore è posizionato sulla pictureBox.
Le mie istruzioni di prova sono semplicemente le seguenti:
 
Codice: [Seleziona]
Public Sub foto_MouseDown()
   With foto
      .Picture = Picture.Load(user.home & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/che-faccio_64.png")
   End With
End

Un'altra cosa che ho notato è che l'immagine, posta fuori dalla directory che contiene il programma utente, non viene caricata. Ho anche provato a richiamarla dentro la pictureBox, in fase di creazione e mi veniva prodotto un errore sulla proprietà picture, ponendola invece, come ho detto prima nella directory di residenza del programma, veniva caricata ancora una volta senza intoppi.
Spero di essersi stato utile.
 :ciao:
Titolo: Re: PictureBox riottosa
Inserito da: vuott - 04 Novembre 2014, 20:41:43
A mio avviso, la riga
  
Codice: gambas [Seleziona]
Public Sub FMain()

stando così posta, non mi pare nient'altro che l'inizio di una sub-routine/procedura, che nel codice da te mostrato non viene invocata da nessuna funzione chiamante.

Otterrai il risultato cercato se imposti come suggerito da Picavbg, oppure ovviamente così:
Codice: gambas [Seleziona]
Private imm As Image
Private pic As Picture

Public Sub Form_Open()
  
   FMain()
  
End



Public Sub FMain()

imm = Image.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")

pic = imm.Picture
With foto
   .W = imm.W
   .H = imm.H
   .Picture = pic
End With

End



o, meglio:
Codice: gambas [Seleziona]
Private imm As Image
Private pic As Picture

Public Sub Form_Open()
  
imm = Image.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")

pic = imm.Picture
With foto
   .W = imm.W
   .H = imm.H
   .Picture = pic
End With

End





Eppure è tutta roba che ho preso dalla Wiki...
Puoi indicare l'indirizzo della pagina ?
Titolo: Re: PictureBox riottosa
Inserito da: Top Fuel - 04 Novembre 2014, 20:57:27
Avevate ragione, ora funziona. :-[
Puoi indicare l'indirizzo della pagina ?

Erano cose che ho letto nel paragrafo della gestione delle immagini, ma non avevo fatto caso che erano inserite in Form_Open.
Risolto, si può chiudere. :)
Titolo: Re: PictureBox riottosa
Inserito da: Top Fuel - 04 Novembre 2014, 20:59:42
Un'altra cosa che ho notato è che l'immagine, posta fuori dalla directory che contiene il programma utente, non viene caricata. Ho anche provato a richiamarla dentro la pictureBox, in fase di creazione e mi veniva prodotto un errore sulla proprietà picture, ponendola invece, come ho detto prima nella directory di residenza del programma, veniva caricata ancora una volta senza intoppi.

A me l'ha caricata pur essendo addirittura fuori dalla Home. :-\
Titolo: Re: PictureBox riottosa
Inserito da: vuott - 04 Novembre 2014, 22:29:02
.....ma non avevo fatto caso che erano inserite in Form_Open.

 :violent:
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 04 Novembre 2014, 22:39:08
Su, dai, dimmelo: ;D

(http://scrittura.pcacademy.it/wp-content/uploads/2013/06/asino.jpg)
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 05 Novembre 2014, 13:47:05
Continuo questa discussione per spiegare a cosa servivano quelle linee di codice la sopra.
E' un piccolo esperimento che stavo facendo usando i puntatori e gli stream in memoria che Vuott aveva spiegato a Gianluigi.
Cioè questo:

Codice: [Seleziona]
' Gambas class file

Private imm As Image
Private pic As Picture

Public Sub Form_Open()
Dim punta As Pointer, flusso As Stream
Dim i, dato As Byte, grandezza, j As Integer
imm = Image.Load("/usr/share/icons/hicolor/512x512/apps/boincmgr.png")
pic = imm.Picture
With foto
   .W = imm.W
   .H = imm.H
   .Picture = pic
End With
punta = Object.Address(imm)
Print punta
grandezza = Object.SizeOf(imm)
Print grandezza
flusso = Memory punta For Read Write
Do
   For j = 0 To grandezza - 1
      Read #flusso, dato
      For i = 1 To 8
         dato = Ror(dato, 1)
         Seek #flusso, j
         Write #flusso, dato As Byte
      Next
   Next
   pic = imm.Picture
   foto.Picture = pic
   Sleep 0.2
Loop
End

Volevo manipolare byte per byte una Image per vedere se si riusciva a ottenere qualche effettino particolare (Ror è solo un esempio) ma ci sono 2 problemi: il primo è che pur essendo l'immagine che uso grande 291 kb Object.SizeOf mi restituisce solo 64 byte, ma la cosa peggiore è che il programma va immediatamente in Errore 11...
Capita anche a voi?
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: vuott - 05 Novembre 2014, 17:19:41
....ma ci sono 2 problemi:...
Capita anche a voi?
Suggerirei, innanzitutto, di prendere bene visione del 2° paragrafo di questa pagina che ho scritto nella WIKI:
http://www.gambas-it.org/wiki/index.php?title=Individuare_i_colori_dei_pixel_di_una_immagine



 
Codice: gambas [Seleziona]
punta = Object.Address(imm)

Per ottenere il Puntatore ai dati caricati in una variabile di tipo Image, è necessario, e ben più agevole, utilizzare la proprietà .Data della Classe Image .


Codice: gambas [Seleziona]
grandezza = Object.SizeOf(imm)
Per poter maneggiare i pixel devi operare sui byte che compongono i pixel medesimi.
Un file immagine, anche se non compresso, non contiene i soli byte puri dei pixel. Se, poi, è compresso, non puoi ricavare la dimensione dell'immagine dal suo file immagine. Sei costretto ad utilizzare, anche questa volta, le risorse della Classe Image di Gambas.
Pertanto, la dimensione in byte effettiva di un'immagine si ottiene moltiplicando i pixel per la quantità di byte che compongono un singolo pixel:
Codice: gambas [Seleziona]
grandezza = imm.Width * imm.Height * len(imm.Format)

L'istruzione len(imm.Format) è semplicemente un mio stratagemma per impostare il formato dei pixel (la quantità di byte che compongono un singolo pixel).
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 05 Novembre 2014, 17:27:47
Quella pagina non l'avevo ancora letta. :-[
Ho capito, modificherò secondo i tuoi suggerimenti.
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Gianluigi - 05 Novembre 2014, 18:26:21
E' un piccolo esperimento che stavo facendo usando i puntatori e gli stream...
Volevo manipolare byte per byte una Image...

miiiiih che ppaura!
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 05 Novembre 2014, 22:51:00
Ho modificato il programma ed in effetti ora funziona, ha un effetto "caleidoscopico" sull'immagine:
Codice: [Seleziona]
' Gambas class file

Private imm As Image

Public Sub Form_Open()
Dim i As Byte
imm = Image.Load("/usr/share/icons/hicolor/128x128/apps/vlc.png")
With foto
   .W = imm.W
   .H = imm.H
   .Picture = imm.Picture
End With
Sleep 1
shifta
foto.Picture = imm.Picture
Sleep 2
shifta
foto.Picture = imm.Picture
End

Public Sub shifta()
Dim flusso As Stream
Dim fo, dato As Byte, j, grandezza As Integer
fo = Len(imm.Format)
flusso = Memory imm.Data For Read Write
grandezza = (imm.H * imm.W * fo) - 1
For j = 0 To grandezza
   Read #flusso, dato
   dato = Rol(dato, 1)
   Seek #flusso, j
   Write #flusso, dato As Byte
Next
End
Ma a parte una certa lentezza di calcolo, sopratutto se l'immagine è grande, nell'esempio qui sopra avrebbe dovuto farmi vedere prima l'immagine originale, poi 2 immagini modificate. Invece mi fa vedere solo l'ultima. Devo capire perchè... :-\
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Picavbg - 06 Novembre 2014, 00:17:42
prova ad aggiungere una Wait 0.05 o simili ogni volta che mostri una nuova immagini
 :ciao:
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 06 Novembre 2014, 11:57:22
Fatto. Nessun risultato.
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Gianluigi - 06 Novembre 2014, 14:15:21
Fatto. Nessun risultato.

Premetto che non ho avuto tempo di provare il tuo codice (la prova è solo rimandata per colpa del momento :)).
Ma così a sensazione se vuoi vedere cosa succede ti conviene comandare shifta() da pulsante.

 :ciao:
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: vuott - 06 Novembre 2014, 14:49:17
Devi istruire l'apertura immediata della finestra del Form, ponendo subito un
 
Codice: gambas [Seleziona]
Public Sub Form_Open()
 
  Dim i As Byte

   Me.Show

  ......


Inoltre devi sostituire le funzioni Sleep con Wait .
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 06 Novembre 2014, 17:37:31
Ora funziona, e pure velocemente. :D
Versione riveduta e corretta:
Codice: [Seleziona]
' Gambas class file

Private imm As Image

Public Sub Form_Open()
Dim i As Byte
Me.Show
imm = Image.Load("/usr/share/icons/hicolor/128x128/apps/vlc.png")
With foto
   .W = imm.W
   .H = imm.H
   .Picture = imm.Picture
End With
Wait 1
For i = 1 To 8
   shifta
   foto.Picture = imm.Picture
   Wait 0.01
Next
End

Public Sub shifta()
Dim flusso As Stream
Dim fo, dato As Byte, j, grandezza As Integer
fo = Len(imm.Format)
flusso = Memory imm.Data For Read Write
grandezza = (imm.H * imm.W * fo) - 1
For j = 0 To grandezza
   Read #flusso, dato
   dato = Rol(dato, 1)
   Seek #flusso, j
   Write #flusso, dato As Byte
Next
End
Ma ci si può ancora lavorare su... ;)
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: vuott - 06 Novembre 2014, 17:40:54
Devo dire che hai fatto un'applicazioncina veramente simpatica !  :D
Io l'ho provata con questa icona:
"/usr/share/icons/hicolor/128x128/apps/vlc.png"

Come s'è potuto vedere dal tuo codice, l'utilizzo della risorsa Memory Stream con i Puntatori può essere praticato.  ;D
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Gianluigi - 06 Novembre 2014, 20:31:32
Proprio forte!
Mi unisco ai complimenti, funziona benissimo con un bell'effetto anche su Gambas3.png
 :ok:
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Picavbg - 06 Novembre 2014, 23:45:34
Fatto. Nessun risultato.
Hai provato anche allungando esageratamente il tempo di wait? (Es. wait 1.0 o > )
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 06 Novembre 2014, 23:53:17
Ho risolto con l'aiuto dell'ineffabile Vuott. :)
Ho messo più sopra il listato riveduto e corretto.
Ma la cosa strana è che se togli il Wait il programma non esegue le trasformazioni, visualizza l'image e basta. Chissà perchè. :)
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 22 Dicembre 2014, 23:06:04
Variazione sul tema.
Date 2 Picturebox ne creiamo una terza che è il risultato di una operazione booleana (che tanto piacciono a Gianluigi... ;D) tra le prime 2, con 6 operatori a scelta.
Bellina l'operazione di And, non trovate? :D
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Gianluigi - 23 Dicembre 2014, 14:47:32
Variazione sul tema.
Date 2 Picturebox ne creiamo una terza che è il risultato di una operazione booleana (che tanto piacciono a Gianluigi... ;D) tra le prime 2, con 6 operatori a scelta.
Bellina l'operazione di And, non trovate? :D

Complimenti vivissimi a mio avviso ti sei guadagnato sul campo i gradi di “Grande Alchimista Manipolatore di Immagini”.  :ok:
L'unico sommesso appunto che posso fare è avvisare che se qualcuno come me non ha i programmi VLC e ICEDOVE farà meglio a cambiare l'icona su cui operare   ;D

 :ciao:
Titolo: Re: [Risolto]PictureBox riottosa
Inserito da: Top Fuel - 23 Dicembre 2014, 19:08:50
Puoi mettere quella che vuoi, anzi, aggiungere una finestra di Dialog per caricarla sul momento. :)