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