Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
L'esempio che hai postato ha una falla logica, sempre che io abbia bene interpretato cosa vuoi fare.
Il problema sta nel fatto che l'immagine: cerchiogreyscale8bpp.bmp con palette a 256 livelli di grigio la converti subito a 4bpp, facendo questo perdi i valori originali dei livelli che poi vorresti convertire a 4bpp.
L'esempio che segue corregge il problema, e ti fa impostare una palette come desideri senza fare una sequenza di iff.
Le righette che vedi ci sono perché non hai calcolato i valori correttamente.
Codice sorgente - presumibilmente VB.NET
' da 8bpp a 4bpp con palette a 3bit
Dim bmp8bpp AsNew Bitmap("C:\cerchiogreyscale8bpp.bmp")
' 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)
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.
' nel vettore colorValues metto i dati dalla locazione ptr che rappresentano bmp8bpp
Giustissimo , prendo l'immagine a 8bpp e la converto subito a 4bpp, così facendo perdo tutti i livelli di grigio.
Quindi , prendo l'immagine ,blocco i bit nel vettore ( e sono ancora 255 livelli )
Creo un bmp delle stesse dimensioni(pixel) a 4bpp, il numero dei byte sarà la metà visto che 1 byte fa due pixel.
A questo punto tutti i pixel che hanno valore compreso tra (0,0,0) a (10,10,10) nel bmp 8bpp dovranno diventare tutti 0 nel bmp a 3bpp.
Per quello mi servivano tutti gli if , perchè non devo cambiare solo un valore , ma tutti i pixel che cadono dentro un certo intervallo di colore , devono diventare tutti uguali .
Se un pixel ha valore (255,255,255) e il successivo (253,253,253) entrambi con la nuova palette diventano 7 mentre se il seguente è (240,240,240) diventa 6 . Devo raggruppare tutti i valori della palette a 256 livelli in 8 livelli .
Da (255,255,255) a (223,223,223) diventano 7
Da(222,222,222) a (190,190,190) diventano 6
e via cosi . Ovviamente il range lo devo impostare.
Si, ho provato l'esempio ma non posso passarlo al sistema per adesso.
Nel tuo esempio la rimappatura è lineare, a me non serve lineare.
Avevo capito che non ti serve lineare , ma ho fatto questo ragionamento:
L'immagine in input è a 8bpp e ha una scala di 256 grigi lineare.
Nell'immagine di output a 4bpp dove solo 3bit della palette vengono usati, ci copio i dati scalati linearmente dall'immagine 8bpp.
Ora agendo sulla palette a 3bit, posso scegliere arbitrariamente il livello RGB di ogni valore 0...7 che mi occorre, senza dover per forza restare lineare.
Ultima modifica effettuata da Carlo il 27/07/2021 alle 21:45
non so come quotare il testo , comunque , questo non l'ho capito
"Ora agendo sulla palette a 3bit, posso scegliere arbitrariamente il livello RGB di ogni valore 0...7 che mi occorre, senza dover per forza restare lineare."
Il sistema converte automaticamente un file 8bpp in un 4bpp in questa maniera
Livello in Livello uscita
0 – 7 0
8 - 53 1
54 – 89 2
90 – 125 3
126 – 161 4
162 – 197 5
198 – 233 6
234 - 255 7
Il motivo per cui voglio convertirlo io è per gestire dei file meno " pesanti" visto le grandi dimensioni dei file.
E anche per poter gestire gli intervalli ,a volte devo usare solo 5 livelli in uscita , però questo non ho capito come dici di farlo .
Grazie , scusa se mi spiego male
Ultima modifica effettuata da bernie il 29/07/2021 alle 8:59