Autore Topic: Gomma per cancellare  (Letto 783 volte)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Gomma per cancellare
« il: 26 Settembre 2021, 15:56:12 »
Per provare il progetto allegato dopo averlo decompresso e lanciato nell'IDE:
- Agire sul pulsante Image Sotto e scegliere Sposi.png
- Agire sul pulsante Image Sopra e scegliere il cuore
- Agendo sui pulsanti Su Giù Sinistra Destra posizionare correttamente l'immagine sotto
- Agire sul pulsante menu e scegliere la gomma con il diametro adatto
- Tenendo premuto il tasto sinistro del mouse cancellare la parte del cuore per mostrare l'immagine sottostante.
- Rilasciare il pulsante del mouse per vedere il risultato corretto
- Se il risultato non soddisfa agire su un pulsante di spostamento e ripetere la cancellazione.

Il progetto è stato ispirato da questa discussione sul forum tedesco, qui riportata da vuott:
https://www.gambas-it.org/smf/index.php?topic=8798.msg50751#msg50751

Purtroppo quello che vorrei ottenere e cioè un cerchio sfumato, non mi riesce.

Ottengo solo un'immagine netta, in alternativa (codice commentato e attivando Paint.FillRule = Paint.FillRuleEvenOdd) posso ottenere intorno al cerchio degli anelli concentrici con la stessa opacità e funziona solo alcune volte altrimenti si vedono solo gli anelli.

Già l'idea alla base del codice non mi convince, si tratta di un escamotage disegno l'immagine sopra il cuore.
Invece occorrerebbe cancellare il cuore per far vedere l'immagine sottostante.

Credo che per farlo occorra saper usare il puntatore Image.Data e il memory stream con il canale alfa tutte cose che so usare in maniera mooolto elementare.

 :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
Re:Gomma per cancellare
« Risposta #1 il: 26 Settembre 2021, 23:08:17 »
.... occorra saper usare il puntatore Image.Data e il memory stream con il canale alfa tutte cose che so usare in maniera mooolto elementare.


...ovviamente come se nella nostra Wiki al riguardo non vi sia manco mezza pagina...  :violent:
« 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
Re:Gomma per cancellare
« Risposta #2 il: 28 Settembre 2021, 17:59:27 »
Io non ho detto che sul nostro wiki riguardo al tema non ci sia nulla.
Mi sono limitato a parlare delle mie capacità.
Per dire ho provato a fare questo:
Avendo un puntatore ad un immagine, ottenerne l'immagine e non ci sono riuscito.
Qualcuno saprebbe indicarmelo?
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
Re:Gomma per cancellare
« Risposta #3 il: 29 Settembre 2021, 17:08:50 »
Io non ho detto che sul nostro wiki riguardo al tema non ci sia nulla.
Questo lo avevo capito.


Avendo un puntatore ad un immagine, ottenerne l'immagine e non ci sono riuscito.
Qualcuno saprebbe indicarmelo?
Suggerisco queste pagine della WIKI:
 - https://www.gambas-it.org/wiki/index.php?title=Modificare_i_colori_dei_pixel_di_un%27immagine_con_la_propriet%C3%A0_.Data_della_Classe_Image_ed_i_Memory_Stream
 - https://www.gambas-it.org/wiki/index.php?title=Creare_un%27immagine_senza_avere_un_file_immagine#Immagine_multicolore

Più in generale sulla risorsa "Memory Stream":
 - https://www.gambas-it.org/wiki/index.php?title=Definizione_ed_uso_dei_Memory_Stream


Se hai problemi, fammi sapere.



« Ultima modifica: 29 Settembre 2021, 17:09:34 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
Re:Gomma per cancellare
« Risposta #4 il: 29 Settembre 2021, 22:22:56 »

Avendo un puntatore ad un immagine, ottenerne l'immagine e non ci sono riuscito.
Qualcuno saprebbe indicarmelo?
Suggerisco queste pagine della WIKI:
 - https://www.gambas-it.org/wiki/index.php?title=Modificare_i_colori_dei_pixel_di_un%27immagine_con_la_propriet%C3%A0_.Data_della_Classe_Image_ed_i_Memory_Stream
 - https://www.gambas-it.org/wiki/index.php?title=Creare_un%27immagine_senza_avere_un_file_immagine#Immagine_multicolore

Più in generale sulla risorsa "Memory Stream":
 - https://www.gambas-it.org/wiki/index.php?title=Definizione_ed_uso_dei_Memory_Stream

Se hai problemi, fammi sapere.

Si le avevo già lette e avevo fatto qualcosa tipo cancellare una riga in un immagine (per dirla in modo semplice).
Vedo che oggi hai cambiato qualcosa ma sostanzialmente...

Ne deduco che avendo il solo Puntatore non sia possibile ottenere l'immagine

 :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
Re:Gomma per cancellare
« Risposta #5 il: 29 Settembre 2021, 22:54:43 »
Ne deduco che avendo il solo Puntatore non sia possibile ottenere l'immagine
Detto in questo modo, è un po' ambiguo.
Il Puntatore - come è noto - è una normale variabile che contiene un valore che rappresenta una cella di memoria (solitamente la prima) ove sono immagazzinati alcuni dati.
Nel nostro caso della Proprietà ".Data" della Classe "Image", tale proprietà restituisce il numero della cella di memoria ove iniziano i dati (in vero proprio i singoli byte costituenti) afferenti ai pixel della immagine. Pertanto, con la risorsa Memory Stream e usando un ciclo noi potremo non solo leggerli, ma anche, volendo, modificarli... trasformando ad esempio il colore di un pixel o addirittura modificando il byte - se posseduto - relativo al canale Alfa.

Insomma la gestione della Proprietà ".Data" della Classe "Image" attraverso la risorsa "Memory Stream" offre la possibilità di gestire i pixel a basso livello, a livello della memoria, operando direttamente sui singoli dati-byte: leggendone i valori semplicemente oppure scrivendoci sopra degli altri.
« Ultima modifica: 29 Settembre 2021, 23:00:15 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
Re:Gomma per cancellare
« Risposta #6 il: 30 Settembre 2021, 09:54:22 »
Ne deduco che avendo il solo Puntatore non sia possibile ottenere l'immagine
Detto in questo modo, è un po' ambiguo.
...
Insomma la gestione della Proprietà ".Data" della Classe "Image" attraverso la risorsa "Memory Stream" offre la possibilità di gestire i pixel a basso livello, a livello della memoria, operando direttamente sui singoli dati-byte: leggendone i valori semplicemente oppure scrivendoci sopra degli altri.

Citazione
  Un puntatore e' un tipo di dato, una variabile che contiene l'indirizzo
  in memoria di un'altra variabile. Si possono avere puntatori a qualsiasi tipo
  di variabile.
  La dichiarazione di un puntatore include il tipo dell'oggetto a cui il
  puntatore punta. 
  In C ogni variabile ha due tipi di valori: una locazione e un valore
  contenuto in quella locazione.
   
  L' operatore & (operatore unario, o monadico) fornisce l'indirizzo di una
  variabile.
  L' operatore * (operatore indiretto, o non referenziato) da' il contenuto
  dell'oggetto a cui punta un puntatore.


Senz'altro è colpa mia che non ho capito, ma tu negli esempi di dereferenziazione conosci la dimensione dell'immagine e manipoli immagini note.

C'è modo in Gambas di ottenere il contenuto dell'oggetto a cui punta il puntatore (in questo caso l'immagine) avendo il solo puntatore e ignorando le dimensioni dell'oggetto?

 :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
Re:Gomma per cancellare
« Risposta #7 il: 30 Settembre 2021, 13:02:02 »
... ignorando le dimensioni dell'oggetto?
Intendi dire " ignorando la quantità di pixel dell'immagine e dunque dei byte che costituiscono i dati stessi dei pixel " ?
Insomma, cosa intendi dire con " dimensioni dell'oggetto " ?
Non dimenticare che la Proprietà ".Data" di un Oggetto "Image" non punta all'Oggetto, come punta la variabile del tipo di tale Oggetto, bensì ad una specifica parte di memoria di quell'Oggetto "Image": l'area dove sono memorizzati i dati-byte afferenti ai pixel dei colori che compongono l'immagine.
Come sappiamo, un conto è l'Oggetto "Image", altra cosa è l'immagine formata (in realtà) dai dati-byte che la costituiscono.
   https://www.gambas-it.org/wiki/index.php?title=Gestire_un_oggetto_Image_agendo_direttamente_sulle_risorse_dei_sorgenti_Gambas
« Ultima modifica: 30 Settembre 2021, 13:10:22 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
Re:Gomma per cancellare
« Risposta #8 il: 30 Settembre 2021, 13:54:05 »
... ignorando le dimensioni dell'oggetto?
Intendi dire " ignorando la quantità di pixel dell'immagine e dunque dei byte che costituiscono i dati stessi dei pixel " ?
Si esatto, ne approfitto anche per scusarmi per il mio modo tutt'altro che scientifico di esprimermi
Citazione
Insomma, cosa intendi dire con " dimensioni dell'oggetto " ?
Non dimenticare che la Proprietà ".Data" di un Oggetto "Image" non punta all'Oggetto, come punta la variabile del tipo di tale Oggetto, bensì ad una specifica parte di memoria di quell'Oggetto "Image": l'area dove sono memorizzati i dati-byte afferenti ai pixel dei colori che compongono l'immagine.
Come sappiamo, un conto è l'Oggetto "Image", altra cosa è l'immagine formata (in realtà) dai dati-byte che la costituiscono.
   https://www.gambas-it.org/wiki/index.php?title=Gestire_un_oggetto_Image_agendo_direttamente_sulle_risorse_dei_sorgenti_Gambas

Comunque come detto tu parti da un'immagine nota.

Purtroppo ho fatto male a intavolare questa discussione ora in quanto sto lavorando ad altro e su questo tema ho perso interesse.
Eventualmente si ti andrà potremmo parlarne più avanti...

 :ciao:
« Ultima modifica: 30 Settembre 2021, 13:56:09 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
Re:Gomma per cancellare
« Risposta #9 il: 30 Settembre 2021, 16:00:01 »
Purtroppo ho fatto male a intavolare questa discussione ora in quanto sto lavorando ad altro e su questo tema ho perso interesse.

« 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.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gomma per cancellare
« Risposta #10 il: 02 Ottobre 2021, 01:49:22 »
Per provare il progetto allegato...
Si potrebbe usare un esempio più semplice:
Codice: [Seleziona]
Private x As Short
Private y As Short
Private punti As New Short[]
Private im1 As New Image
Private im2 As New Image


Public Sub Form_Open()
 
  DrawingArea1.Cursor = New Cursor(Picture["icon:/16/pen"], 2, 13)
 
  im1 = im1.Load("/percorso/prima/immagine")    ' l'immagine di fondo
  im2 = im2.Load("/percorso/seconda/immagine")  ' l'immagine che copre quella di fondo
 
End

Public Sub DrawingArea1_Draw()   
 
  Dim i As Integer
 
  With Paint
    .DrawImage(im1, 0, 0, im1.W, im1.H, 1.0, Null)
    .DrawImage(im2, 0, 0, im2.W, im2.H, 0.9, Null)
    For i = 0 To punti.Max Step 2
      .Brush = .Image(im1)
      .Arc(punti[i], punti[i + 1], 16, Rad(0), Rad(360), False)
      .Fill
    Next
    .End
  End With

End

Public Sub DrawingArea1_MouseDown()     
 
  x = Mouse.X   
  y = Mouse.Y
 
End

Public Sub DrawingArea1_MouseMove()

  With punti
    .Push(Mouse.X)
    .Push(Mouse.Y)
  End With

  DrawingArea1.Refresh()

End

Public Sub DrawingArea1_MouseUp()
 
  With punti
    .Push(x)
    .Push(y)
  End With
 
  DrawingArea1.Refresh()

End
« Ultima modifica: 02 Ottobre 2021, 02:10:39 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
Re:Gomma per cancellare
« Risposta #11 il: 02 Ottobre 2021, 13:59:58 »
Francamente è molto simile solo ridotto ai minimi termini  :-\
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
Re:Gomma per cancellare
« Risposta #12 il: 02 Ottobre 2021, 15:30:43 »
...appunto.   :rotfl:
« 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. »