Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Salve a tutti
ritorno dopo le ferie con i miei problemi....
Ho un bmp 8bpp lo carico , controllo che effettivamente sia 8bpp con una palette a 256.
A questo punto lo devo "stirare",prima in una direzione , lo salvo con nuovo nome e poi stiro l'originale nell'altra dimensione .
Per fare ciò , uso le GDI+ quindi non posso usare un bmp con pixel indicizzati, il minimo che posso usare è Format16bppRgb555.
Però io ho bisogno che il mio bmp sia a 8 bpp, quindi lo clono e lo trasformo in Format8bppIndexed.
Fino qui tutto ok , però la palette cambia. Io dopo aver stirato la grafica in una dimensione , devo modificare la palette.
Qui iniziano i problemi . Dal mio punto di vista tutti i problemi sono dovuti al fatto che io converto il file in 8bpp, ma non converto la palette colore, quindi quando la vado a modificare , non ho una palette a 256colori come l'originale , ma la palette dei 16bpp. Qualche suggerimento ?
Grazie
Quando carichi il bmp a 8bpp, dopo aver controllato che ha una palette a 256, la copi in un vettore. Converti a 16bpp, esegui tutti gli stiramenti che vuoi. Riconverti a 8bpp e riassoci la palette originale che ti eri salvato nel vettore.
Carico la palette nel vettore usando MarshalCopy. Creo una grafica a 16bpp e la uso per stirare la grafica a 8bpp. La clono a 8bpp e gli carico la palette salvata sul vettore. Corretto?
Dim origine As Bitmap =New Bitmap("C:\cerchio8bpp.bmp")
Dim palette_origine As Imaging.ColorPalette= origine.Palette
Dim modificato AsNew Bitmap(origine.Width, origine.Height*4.4, Imaging.PixelFormat.Format16bppRgb555)
Using gr = Graphics.FromImage(modificato)'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(origine, New Rectangle(0, 0, origine.Width, origine.Height*4.4))'nel layer grafico viene disegnata l'immagine in posizione 0,0 ridimensionata in width, height
End Using
'clono il bmp modificato per poterlo salavare a 8bpp
Dim clonemodificato AsNew Rectangle(0, 0, modificato.Width, modificato.Height)
Dim clonemodificato8bpp As Bitmap = modificato.Clone(clonemodificato, Imaging.PixelFormat.Format8bppIndexed)
Però il risultato non è corretto , l'immagine che carico è un cerchio nero su sfondo bianco , dopo la modifica , lo sfondo non è bianco ma grigio e questo crea dei problemi dopo quando devo modificare la palette rendendola a 8 livelli .
Allego la grafica che uso per test .
Grazie
Hai ragione, la conversione a 8bpp, crea una palette ottimizzata e il bianco non è più nel livello originale.
1) si può riordinare tutto, riportando il bianco al livello 255
2) si può usare ColorMatch, per creare la BMP8bpp a mano
3) si può ritornare al metodo del vettore/LockBits se le trasformazioni non sono impegnative
Lo zoom orizzontale e/o verticale, non è impegnativo.
Un codice senza pretesa di funzionare in tutte le situazioni e con zoom di soli interi
Codice sorgente - presumibilmente VB.NET
Dim Originale AsNew Bitmap("cerchio8bpp.bmp")
Dim paletteOriginale As Imaging.ColorPalette= Originale.Palette
Dim areaOriginale AsNew Rectangle(0, 0, Originale.Width, Originale.Height)
Dim bmpDataOriginale As Imaging.BitmapData= Originale.LockBits(areaOriginale, Imaging.ImageLockMode.ReadWrite, Originale.PixelFormat)
Dim ptrOriginale As IntPtr = bmpDataOriginale.Scan0' conterrà l'indirizzo di memoria
Dim bytesOriginale AsInteger= Math.Abs(bmpDataOriginale.Stride)* Originale.Height
Dim levelValuesOriginale(bytesOriginale - 1)AsByte
Ho provato l'esempio di Carlo e funziona , però, come input ho una immagine greyscale , mentre dopo l'eleborazione mi ritrovo con una immagine colorscale .
Ho cercato in rete , ma non ho trovato niente .
Mi sembra di ricordare che Carlo disse che VB.Net non gestisce greyscale . Mi sbaglio ?
Grazie
Quella immagine dovrebbe essere greyscale, almeno, l'originale è greyscale.
Credo che non ci sia soluzione, mi serve come out un bmp 8bpp greyscale.
Infatti tutti gli esempi che ho trovato in rete, non convertono in greyscale, ma rendono una immagine RGB grigia, e non sono neanche convinto che la conversione con i tre canali uguali sia corretta, visto che l'occhio umano ha sensibilità diversa in base al canale ( è molto più sensibile al verde che al blu)
Se .Net non supporta greyscale, quale linguaggio lo supporta? Grazie