Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Per avere la discussione archiviata e leggibile anche senza connessione a internet: con Mozilla Ctrl+s, salva la pagina visualizzata al momento, oppure menù in alto a destra, tre righette orizzontali: Salva pagina con nome.
Tutto l'Html, le immagini, i CSS e i js, vengono organizzati in cartelle e all'esterno della cartella ci sarà un file htm apribile con un browser.
Devi tenere presente che potrai scorrere tutta la pagina salvata e copiare eventuali testi di interesse, ma se clicchi qualsiasi collegamento o tastino verrà aperto il link reale alla pagina internet, che se presente funzionerà regolarmente, ma non sarai più nella tua pagina salvata.
Questo implica che per salvare questa discussione dovrai effettuare 5 salvataggi, uno per ogni pagina e che eventuali allegati li dovrai scaricare separatamente per averli disponibili senza internet attivo.
Ultima modifica effettuata da Carlo il 22/07/2021 alle 9:32
Mi aiuteresti a capirlo? Il mio scopo è di ingrandire una grafica, a volte solo una dimensione, altre volte entrambe le dimensioni ma con ratio differente. Grazie
Ultima modifica effettuata da bernie il 22/07/2021 alle 11:40
PublicSharedFunction ResizeImage(img As Image, widthAsInteger, height AsInteger)As Image
Dim newImage =New Bitmap(width, height)' nuova bmp con le dimensioni finali date
Using gr = Graphics.FromImage(newImage)' layer grafico che permette la scrittura in newImage con le istruzioni GDI+
gr.SmoothingMode= SmoothingMode.HighQuality' qualità delle trasformazioni grafiche
gr.InterpolationMode= InterpolationMode.HighQualityBicubic' tipologia dell'algoritmo di ridimensionamento
gr.PixelOffsetMode= PixelOffsetMode.HighQuality' precisione dei calcoli di un singolo pixel
gr.DrawImage(img, New Rectangle(0, 0, width, height))' nel layer grafico viene disegnata l'immagine img in posizione 0,0 ridimensionata in width, height
End Using
Return newImage ' newImage ora contiene img con le nuove dimensioni
EndFunction
Mi aiuteresti a capirlo?
Il mio scopo è di ingrandire una grafica, a volte solo una dimensione, altre volte entrambe le dimensioni ma con ratio differente.
Grazie
Ti ho remmato il siglificato delle righe, ma questa è un'altra domanda, non è più pertinente in questa discussione
Ultima modifica effettuata da Carlo il 23/07/2021 alle 15:55
Hai ragione, scusa per OT. Ritornando in tema, quando rimappiamo una palette 256 toni in una a 16, la divisione è a step di 16. Io però anche avendo un 4bpp devo usare solo 8 livelli, quindi il quarto bit dovrebbe sempre essere a 0, quindi step di 32. E nel caso che non volessi una suddivisione lineare?
i livelli 0...7 li inventi tu l'essenziale è che i tre valori RGB siano uguali per ottenere un grigio
i livelli oltre il 7 li puoi azzerare o lasciare come sono
Ultima modifica effettuata da Carlo il 24/07/2021 alle 10:49
Quando rimappo una grafica con palette da 8bpp a 4bpp come avviene la cosa ? raggruppa n colori e li associa al nuovo colore ?
Per esempio da 255 a 230 diventa 15 , da 229 a 200 diventa 14 e via così?
Non so di preciso come funziona so che di default da 8bpp a 4bpp è molto grossolano, ci dovrebbero essere delle istruzioni per rimappare la palette e quantizzarla per ottenere risultati molto raffinati, in GDI+ c'è anche colorMatrix.
La cosa si può fare anche a mano usando le conoscenze di base.
Apri un nuovo progetto WinForm e nel form metti due picturebox affiancate.
La prima parte del codice crea un'immagine con una sfumatura da 256 livelli di grigio e i dati sono contenuti nel vettore colorValues La seconda parte del codice crea un'immagine vuota con palette a 16 livelli di grigio e i dati sono contenuti nel vettore vuoto levelValues La terza parte del codice legge colorValues e lo usa per scrivere con palette scalata in levelValues La quarta parte del codice mette i dati contenuti nei vettori creati in bmp8bpp e bmp4bpp, per mostrarli su due picturebox
Codice sorgente - presumibilmente VB.NET
PublicClass Form1
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMyBase.Load
Dim bmp8bpp AsNew Bitmap(255, 255, Imaging.PixelFormat.Format8bppIndexed)' immagine 8bpp
' blocco i bit della bitmap
Dim area8 As Rectangle =New Rectangle(0, 0, bmp8bpp.Width, bmp8bpp.Height)
Dim bmpData8 As System.Drawing.Imaging.BitmapData= bmp8bpp.LockBits(area8, Drawing.Imaging.ImageLockMode.ReadWrite, bmp8bpp.PixelFormat)
' creo una palette con 256 livelli di grigio
Dim palette256 As Imaging.ColorPalette= bmp8bpp.Palette
For i = 0 To palette256.Entries.Length- 1
palette256.Entries(i)= Color.FromArgb(i, i, i)
Next i
' associo la palette creata alla bitmap 8bpp,
' i valori 0...255 ora corrispondono alla scala dal nero al bianco
bmp8bpp.Palette= palette256
Dim ptr8 As IntPtr = bmpData8.Scan0' puntatore all'indirizzo di memoria del primo byte.
Dim bytes8 AsInteger= Math.Abs(bmpData8.Stride)* bmp8bpp.Height' calcolo dei bytes necessari
Dim colorValues(bytes8 - 1)AsByte' un array che conterrà tutti i bytes della bitmap.
' creo una sfumatura
For colonna = 0 To bmp8bpp.Width
For riga = 0 To Math.Abs(bmpData8.Stride)- 2
Dim ind AsInteger= colonna + riga * Math.Abs(bmpData8.Stride)'calcolo l'indice
' per semplificare l'esempio, la bitmap è larga 256 pixel,
' la colonna viene usata anche per impostare il colore
colorValues(ind)= colonna ' il valore di colonna come valore del byte di grigio 0...255
Next
Next
' dichiaro bmp4bpp
Dim bmp4bpp AsNew Bitmap(255, 255, Imaging.PixelFormat.Format4bppIndexed)
' blocco i bit della bitmap
Dim area4 As Rectangle =New Rectangle(0, 0, bmp4bpp.Width, bmp4bpp.Height)
Dim bmpData4 As System.Drawing.Imaging.BitmapData= bmp4bpp.LockBits(area4, Drawing.Imaging.ImageLockMode.ReadWrite, bmp4bpp.PixelFormat)
' creo una palette con 16 livelli di grigio
Dim palette16 As Imaging.ColorPalette= bmp4bpp.Palette
For i = 0 To palette16.Entries.Length- 1
palette16.Entries(i)= Color.FromArgb(i * 17, i * 17, i * 17)
Next i
' associo la palette creata alla bitmap 4bpp,
' i valori 0...15 ora corrispondono alla scala dal nero al bianco
bmp4bpp.Palette= palette16
Dim ptr4 As IntPtr = bmpData4.Scan0
Dim bytes4 AsLong= Math.Abs(bmpData4.Stride)* bmp4bpp.Height' calcolo dei bytes necessari
Dim levelValues(bytes4 - 1)AsByte
' nel vettore che rappresenta bmp4bpp ci copio i dati dal vettore che rappresenta bmp8bpp, scalati
' scorro tutto il vettore colorValues che rappresenta bmp8bpp
For ind = 0 To bytes8 -1
' il vettore levelValues che rappresenta bmp4bpp è lungo la metà rispetto a colorValues
' il valore di un pixel di colorValues, in un byte replicato per due pixel
In questa maniera posso decidere io che range di livelli originali associo al nuovo livello .
Quello che non ho capito è perchè nei toni medi , mi colora un pixel si e uno no .