Autore Topic: Come ti buco l'immagine  (Letto 256 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.258
  • Ne mors quidem nos iunget
    • Mostra profilo
Come ti buco l'immagine
« il: 20 Febbraio 2018, 16:33:41 »
IN PRINCIPIO FU LA MEMORIA

...varie volte ci si è domandato a cosa possano servire in Gambas le variabili di tipo Puntatore.

Una variabile di tipo Puntatore, come si sa, immagazzina, sì, un valore numerico, ma questo valore si riferisce all'indirizzo di un'area di memoria riservata.
Un'area di memoria comunque riservata (allocata) è una porzione di memoria protetta da eventuali sovrascritture da parte del sistema, sino a quando non verrà deallocata "automaticamente" dal sistema medesimo, oppure arbitrariamente da codice mediante un'apposita funzione.

Da ciò se ne deduce che, come ho sempre cercato di spiegare anche in altri miei interventi al riguardo, la variabile di tipo Puntatore può diventare, se opportunamente gestita cone le risorse predisposte e con l'aritmetica dei Puntatori, una diretta, preziosa e potente chiave di accesso all'area di memoria puntata.


CHI DOMINA la MEMORIA, DOMINA il MONDO degli "OGGETTI"

Ogni "Oggetto" di Gambas è innanzitutto costituito da più porzioni di memoria, organizzate secondo le specifiche Strutture previste dai sorgenti di Gambas per ciascun Oggetto, dedicate a immagazzinare i dati che caratterizzeranno gli Oggetti medesimi.

Poter e sapere dunque accedere alle aree di memoria di un Oggetto, significa poter modificare i valori delle sue proprietà.


Come esempio pratico, svolgeremo questa esercitazione commentata:
* creeremo un Oggetto di tipo "Image" di dimensioni 3x3 pixel
* riepiremo questo Oggetto di colore "Rosso";
* modificheremo il pixel, che ci appare come centrale nell'immagine, ossia il 5° pixel, assegnandogli la massima trasparenza (canale Alfa = &h00).

E' necessario attivare anche i seguenti Componenti di Gambas: "gb.image" e "gb.image.it" .
Codice: [Seleziona]
Public Sub Main()

  Dim im As Image
  Dim st As Stream
 
' Creiamo un Oggetto "Image" di dimensioni 3x3 pixel:
   im = New Image(3, 3)
   
' Coloriamo l'intera immagine di rosso:
   im = im.Fill(Color.Red)

' Salviamo questa prima versione dell'immagine creata, interamente colorata di rosso:
    im.Save("/tmp/prima.png", 100)
   
' Con i "Memory Stream" accediamo alla memoria dell'Oggetto di tipo "image"' mediante la proprietà ".Data" della sua corrispondente variabile.
' In particolare la proprietà ".Data" dell'Oggetto "Image" è sostanzialmente un Puntatore, giacché ci restituisce l'indirizzo di memoria dell'area,
' ove tale Oggetto conserva i dati afferenti ai pixel dell'immagine.
   st = Memory im.Data For Write

' Individuiamo il byte di memoria, ove hanno inizio i valori del pixel, al quale modificare i valori.
' Il byte di memoria va individuato tenendo conto del "formato" dell'immagine, ossia di quanti byte è formato un singolo pixel, moltiplicato per il numero indicizzato del pixel da modificare.
   Seek #st, 4 * Len(im.Format)
   
' Scriviamo nella porzione, come sopra individuata, di memoria il nuovo valore del pixel interessato.
' Per attribuire la trasparenza, il byte (del pixel) corrispondente al canale "Alfa" dovrà essere impostato a zero.
   Write #st, 0 As Integer
   st.Close
   
' Salviamo l'immagine per andarla a vedere:
   im.Save("/tmp/bucata.png", 100)

End
« Ultima modifica: 20 Febbraio 2018, 20:30:16 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. »