26/07/21 13:03
bernie
Io avevo fatto una cosa molto grossolana
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 .
Dim originale As New Bitmap("C:\cerchiogreyscale8bpp.bmp") Dim clonerettangolo As New Rectangle(0, 0, originale.Width, originale.Height) Dim clone4bpp As Bitmap = originale.Clone(clonerettangolo, Imaging.PixelFormat.Format4bppIndexed) 'creo la palette scala di grigio Dim palette As Imaging.ColorPalette = clone4bpp.Palette For i = 0 To palette.Entries.Length - 1 If i > 7 Then palette.Entries(i) = Color.White Else palette.Entries(i) = Color.FromArgb(255 - i * 36.4, 255 - i * 36.4, 255 - i * 36.4) End If Next i 'associo la palette creata alla bitmap 4bpp, 'i valori 0...15 ora corrispondono alla scala dal nero al bianco clone4bpp.Palette = palette ' blocco i bit della bitmap per poter lavorare direttamente su un vettore di bytes Dim area As Rectangle = New Rectangle(0, 0, clone4bpp.Width, clone4bpp.Height) Dim bmpData As Imaging.BitmapData = clone4bpp.LockBits(area, Imaging.ImageLockMode.ReadWrite, clone4bpp.PixelFormat) ' puntatore all'indirizzo di memoria del primo byte. Dim ptr As IntPtr = bmpData.Scan0 ' un vettore che conterrà tutti i bytes della bitmap. Dim bytes As Long = Math.Abs(bmpData.Stride) * clone4bpp.Height ' calcolo dei bytes necessari Dim colorValues(bytes - 1) As Byte ' nel vettore colorValues metto i dati dalla locazione ptr che rappresentano clone4bpp System.Runtime.InteropServices.Marshal.Copy(ptr, colorValues, 0, bytes) For ind = 0 To bytes - 1 Dim primosemibyte As Byte = colorValues(ind) \ 16 Dim secondosemibyte As Byte = colorValues(ind) - primosemibyte * 16 'primobyte If primosemibyte >= 0 And primosemibyte <= 7 Then primosemibyte = 7 ElseIf primosemibyte >= 8 And primosemibyte <= 53 Then primosemibyte = 6 ElseIf primosemibyte >= 54 And primosemibyte <= 89 Then primosemibyte = 5 ElseIf primosemibyte >= 90 And primosemibyte <= 125 Then primosemibyte = 4 ElseIf primosemibyte >= 126 And primosemibyte <= 161 Then primosemibyte = 3 ElseIf primosemibyte >= 162 And primosemibyte <= 197 Then primosemibyte = 2 ElseIf primosemibyte >= 198 And primosemibyte <= 233 Then primosemibyte = 1 ElseIf primosemibyte >= 234 Then primosemibyte = 0 End If 'secondobyte If secondosemibyte >= 0 And secondosemibyte <= 7 Then primosemibyte = 7 ElseIf secondosemibyte >= 8 And secondosemibyte <= 53 Then primosemibyte = 6 ElseIf secondosemibyte >= 54 And secondosemibyte <= 89 Then primosemibyte = 5 ElseIf secondosemibyte >= 90 And secondosemibyte <= 125 Then primosemibyte = 4 ElseIf secondosemibyte >= 126 And secondosemibyte <= 161 Then primosemibyte = 3 ElseIf secondosemibyte >= 162 And secondosemibyte <= 197 Then primosemibyte = 2 ElseIf secondosemibyte >= 198 And secondosemibyte <= 233 Then secondosemibyte = 1 ElseIf secondosemibyte >= 234 Then secondosemibyte = 0 End If colorValues(ind) = primosemibyte * 16 + secondosemibyte ' ricompongo il byte con i due pixel Next System.Runtime.InteropServices.Marshal.Copy(colorValues, 0, ptr, bytes) clone4bpp.UnlockBits(bmpData) ' sblocco bit clone4bpp.SetResolution(360, 360) clone4bpp.Save("C:\remap8bppa3bpp.bmp", Imaging.ImageFormat.Bmp) clone4bpp.Dispose() End Sub
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 .
aaa