10/08/21 14:13
Carlo
Ultima modifica effettuata da Carlo 10/08/21 14:31
in programmazione tutto è permesso
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' Valori impostabili Dim larghezzamm = 1000 Dim altezzamm = 2000 Dim framemm = 65 Dim gapmm = 5 Dim mmpixel = 14.17 Dim nteste = 1 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 origineH, origineW, fineH, fineW As Double Dim nome As String = "" fineW = frontestampa ' una volta definiti i valori l'immagine non cambierà più in dimensioni Dim immagine As New Bitmap(fineW, altezzapixel - frontestampa, Imaging.PixelFormat.Format4bppIndexed) immagine.SetResolution(360, 360) ' creo una palette con 8 livelli di grigio invertita Dim palette As Imaging.ColorPalette = immagine.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...7 ora corrispondono alla scala dal bianco al nero immagine.Palette = palette Dim area As Rectangle = New Rectangle(0, 0, immagine.Width, immagine.Height) ' area di lavoro LockBits Dim bmpData As Imaging.BitmapData = Nothing ' conterrà i dati della bitmap Dim ptr As IntPtr ' conterrà l'indirizzo di memoria Dim bytes As Integer ' conterrà la dimensione del vettore Dim colorValues() As Byte = Nothing ' conterrà il vettore ' ad ogni case, il vettore e la bitmap vengono reinizializzati For i = 0 To 4 Select Case i Case 0 'primo lato verticale (lato sinistro) bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat) ptr = bmpData.Scan0 bytes = Math.Abs(bmpData.Stride) * immagine.Height ReDim colorValues(bytes - 1) ' vettore vuoto origineH = 0 'queste sono le dimensioni della grafica bianca origineW = 0 fineH = altezzapixel - frontestampa nome = "latosx" rettangolo(origineW, origineH, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 0) ' rettangolo bianco rettangolo(gappixel, gappixel, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 7) ' rettangolo nero Case 1 'primo lato orrizzontale (superiore) bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat) ptr = bmpData.Scan0 bytes = Math.Abs(bmpData.Stride) * immagine.Height ReDim colorValues(bytes - 1) ' un vettore adeguato con tutti zeri (bianco) origineH = 0 'queste sono le dimensioni della grafica bianca origineW = 0 fineH = larghezzapixel - frontestampa nome = "superiore" rettangolo(origineW, origineH, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 0) ' rettangolo bianco rettangolo(gappixel, gappixel, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 7) ' rettangolo nero Case 2 'secondo lato verticale (lato destro) bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat) ptr = bmpData.Scan0 bytes = Math.Abs(bmpData.Stride) * immagine.Height ReDim colorValues(bytes - 1) ' un vettore adeguato con tutti zeri (bianco) origineH = 0 'queste sono le dimensioni della grafica bianca origineW = 0 nome = "latodx" rettangolo(origineW, origineH, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 0) ' rettangolo bianco rettangolo(gappixel, gappixel, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 7) ' rettangolo nero Case 3 'secondo lato orrizzontale (base) bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat) ptr = bmpData.Scan0 bytes = Math.Abs(bmpData.Stride) * immagine.Height ReDim colorValues(bytes - 1) ' un vettore adeguato con tutti zeri (bianco) origineH = 0 'queste sono le dimensioni della grafica bianca origineW = 0 nome = "base" rettangolo(origineW, origineH, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 0) ' rettangolo bianco rettangolo(gappixel, gappixel, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 7) ' rettangolo nero Case 4 'una elle rovesciata nera bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat) ptr = bmpData.Scan0 bytes = Math.Abs(bmpData.Stride) * immagine.Height ReDim colorValues(bytes - 1) ' un vettore adeguato con tutti zeri (bianco) nome = "elle rovesciata" rettangolo(200, 500, fineW, 700, bmpData.Stride, immagine.Height, colorValues, 7) ' rettangolo nero rettangolo(200, 700, 400, fineH, bmpData.Stride, immagine.Height, colorValues, 7) ' rettangolo nero End Select ' al termine di ogni case il vettore creato viene copiato nella bitmap, e poi sbloccata per il salvataggio System.Runtime.InteropServices.Marshal.Copy(colorValues, 0, ptr, bytes) immagine.UnlockBits(bmpData) 'sblocco bit immagine.Save("C:\" & nome & ".bmp", Imaging.ImageFormat.Bmp) immagine.Save("C:\" & name & ".tiff", Imaging.ImageFormat.Tiff) Next 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 15, nel caso di palette a 3 bit invertita, i valori 0...7 danno una scala da bianco a nero ' i valori 8...15 se usati daranno un bianco. 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 x1 = Math.Truncate(x1 / 2) x2 = Math.Truncate(x2 / 2) 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 ' a 4bpp scrivo 2 pixel adiacenti alla volta colore = colore + colore * 16 ' valore per due pixel uguali 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