Quando dichiari un vettore conterrà tutti zeri.
Se ora devi disegnare su uno sfondo di zeri, devi mettere un valore più alto di zero, la massima differenza ce l'hai con 255.
Come vedi non ho menzionato colori, perché in un file indicizzato i colori che rappresentano i valori inseriti nel vettore sono definiti nella palette.
Ora hai un vettore con zeri e 255, se nell'header metti quello con la palette BW, gli zeri saranno neri i 255 bianchi, avviene l'inverso se metti l'header WB.
Imports System.IO
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Valori impostabili
Dim larghezzamm = 1000
Dim altezzamm = 2000
Dim framemm = 70
Dim gapmm = 70
Dim mmpixel = 14.17
Dim nteste = 3
Dim larghezzapixel = Math.Truncate(larghezzamm * mmpixel) - 1 'converto le dimensioni del pannello da mm a pixel
Dim altezzapixel = Math.Truncate(altezzamm * mmpixel) - 1
Dim framepixel = Math.Truncate(framemm * mmpixel) - 1
Dim gappixel = Math.Truncate(gapmm * mmpixel) - 1
Dim frontestampa = (1000 * nteste) - 1
Dim fineH, fineW As Double
fineW = frontestampa
fineH = altezzapixel - frontestampa
Dim sw As New Stopwatch
' una volta definiti i valori l'immagine non cambierà più in dimensioni
Dim immagineH As New Bitmap(fineW, altezzapixel - frontestampa, Imaging.PixelFormat.Format8bppIndexed) 'immagine per l'altezza
immagineH.SetResolution(360, 360)
' la palette vale quella nell'Header nell'immagine di riferimento:
' bandind2_BlackWhite.bmp 0=nero 255=bianco (il fondo della bmp sarà nero)
' bandind2_WhiteBlack.bmp 255=nero 0=bianco (il fondo della bmp sarà bianco)
'************** grafica
Dim areaH As Rectangle = New Rectangle(0, 0, immagineH.Width, immagineH.Height) ' area di lavoro LockBits
Dim bmpDataH As Imaging.BitmapData = Nothing ' conterrà i dati della bitmap
Dim ptrH As IntPtr ' conterrà l'indirizzo di memoria
Dim bytesH As Integer ' conterrà la dimensione del vettore
Dim colorValuesH() As Byte = Nothing ' conterrà il vettore
'una elle rovesciata di 255
bmpDataH = immagineH.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineH.PixelFormat)
ptrH = bmpDataH.Scan0
bytesH = Math.Abs(bmpDataH.Stride) * immagineH.Height
ReDim colorValuesH(bytesH - 1) 'un vettore adeguato con tutti zeri
sw.Restart()
rettangolo(200, 500, fineW, 700, bmpDataH.Stride, immagineH.Height, colorValuesH, 255) ' bandind2_BlackWhite.bmp 0=nero 255=bianco, bandind2_WhiteBlack.bmp 255=nero 0=bianco
rettangolo(200, 700, 400, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 255) ' bandind2_BlackWhite.bmp 0=nero 255=bianco, bandind2_WhiteBlack.bmp 255=nero 0=bianco
Me.Text = "una elle rovesciata di 255 tracciata in: " & sw.ElapsedMilliseconds & " ms."
System.Runtime.InteropServices.Marshal.Copy(colorValuesH, 0, ptrH, bytesH)
immagineH.UnlockBits(bmpDataH) 'sblocco bit
immagineH.Save("elle rovesciata HeaderBW.bmp", Imaging.ImageFormat.Bmp)
' copio tutto l'Header del file d'origine nel file creato
Dim fsO As New FileStream("bandind2_BlackWhite.bmp", FileMode.Open, FileAccess.Read) ' nero bianco, bandind2_WhiteBlack.bmp bianco nero
Dim fsS As New FileStream("elle rovesciata HeaderBW.bmp", FileMode.Open, FileAccess.Write) ' stesso nome del file salvato
Dim br As New BinaryReader(fsO)
Dim bw As New BinaryWriter(fsS)
Dim Byteletto As Byte ' lettura Byte
' copio pari pari l'header d'origine
Do While fsO.Position <= &H435 ' fino alla fine all HEX scelto, termine Header di un BMP
Byteletto = br.ReadByte() ' lettura byte dall'origine
bw.Seek(CInt(fsO.Position - 1), SeekOrigin.Begin) ' posizione di destinazione
bw.Write(Byteletto) ' scrittura del byte letto in pari posizione
Loop
' aggiusto i parametri che potrebbero essere variati
bw.Seek(&H2, SeekOrigin.Begin) ' in posizione &H2 = lunghezza file
bw.Write(fsS.Length) ' metto la lunghezza del file
bw.Seek(&H12, SeekOrigin.Begin) ' in posizione &H12 = larghezza
bw.Write(immagineH.Width) ' scrivo la larghezza
bw.Seek(&H16, SeekOrigin.Begin) ' in posizione &H16 = altezza
bw.Write(immagineH.Height) ' scrivo l'altezza
fsO.Close()
fsS.Close()
immagineH.Dispose()
End Sub
' traccia un rettangolo data la sua diagonale, prima coordinata x1,y1 seconda coordinata x2,y2
' la larghezza e l'altezza servono per calcolare l'indice e limitare valori fuori range,
' non devono differire dalla dimensione del vettore da bitmap. larghezza = bmpData.Stride, altezza = immagine.Height
' il vettore va passato per fare in modo che i rettangoli siano scritti nella stessa area grafica
' il colore può essere un valore tra 0 e 255
Sub rettangolo(x1 As UInt32, y1 As UInt32, x2 As UInt32, y2 As UInt32, larghezza As UInt32, altezza As UInt32, vettore() As Byte, colore As Byte)
' limite valori
If x1 >= larghezza Then x1 = larghezza - 1
If x2 >= larghezza Then x2 = larghezza - 1
If y1 >= altezza Then y1 = altezza - 1
If y2 >= altezza Then y2 = altezza - 1
For colonna As UInt32 = x1 To x2
For riga As UInt32 = y1 To y2
Dim ind As UInt32 = colonna + riga * larghezza 'calcolo l'indice
vettore(ind) = colore
Next
Next
End Sub
End Class
allegati i due file dove prelevare l'Header, positivo o negativo