17/07/21 9:06
bernie
Infatti , mi sono incartato nella lettura dei Byte,credo e spero solo li, anche se non è poco.
Ho provato anche a 8bpp , modificando la pallette colori ,il risultato è il medesimo , un bmp completamente nero.
Il problema per me è nel ciclo If colorValues(ind) < 14 , ma non capisco .
Grazie per eventuali suggerimenti .
Allego anche il file che uso per fare le prove.
' clono un file esistente e lo salvo a 4bpp Dim originale As New Bitmap("C:\greca.tiff") Dim clonerettangolo As New Rectangle(0, 0, originale.Width, originale.Height) Dim clone4bpp As Bitmap = originale.Clone(clonerettangolo, Imaging.PixelFormat.Format4bppIndexed) clone4bpp.Save("C:clonegreca4bpp.bmp", Imaging.ImageFormat.Bmp) clone4bpp.Save("C:clonegreca4bpp.tiff", Imaging.ImageFormat.Tiff) ' creo la pallette colori Dim palette As Imaging.ColorPalette = clone4bpp.Palette For i = 0 To palette.Entries.Length - 1 palette.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 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 ' quello che vorrei fare è andare a leggere il valore del pixel e nel caso che sia diverso dal bianco lo coloro come voglio io For ind = 0 To Math.Abs(bmpData.Stride) - 1 If colorValues(ind) < 14 Then colorValues(ind) = 7 End If Next System.Runtime.InteropServices.Marshal.Copy(colorValues, 0, ptr, bytes) clone4bpp.UnlockBits(bmpData) ' sblocco bit clone4bpp.SetResolution(360, 360) clone4bpp.Save("C:\clonegreca4bpp.bmp", Imaging.ImageFormat.Bmp) clone4bpp.Save("C:\clonegreca4bpp.tiff", Imaging.ImageFormat.Tiff) clone4bpp.Dispose() End Sub
Ho provato anche a 8bpp , modificando la pallette colori ,il risultato è il medesimo , un bmp completamente nero.
Il problema per me è nel ciclo If colorValues(ind) < 14 , ma non capisco .
Grazie per eventuali suggerimenti .
Allego anche il file che uso per fare le prove.
aaa