10/08/21 18:58
bernie
Io ho fatto così, non è elegante e sicuramente si può ottimizzare , però funziona .
Comunque non cicla i case
Comunque non cicla i case
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 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 immagineH As New Bitmap(fineW, altezzapixel - frontestampa, Imaging.PixelFormat.Format4bppIndexed) 'immagine per l'altezza immagineH.SetResolution(360, 360) Dim immagineW As New Bitmap(fineW, larghezzapixel - frontestampa, Imaging.PixelFormat.Format4bppIndexed) 'immagine per la larghezza immagineW.SetResolution(360, 360) ' creo una palette con 8 livelli di grigio invertita Dim palette As Imaging.ColorPalette = immagineH.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 immagineH.Palette = palette immagineW.Palette = palette '**************creo la grafica verticale 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 '**************creo la grafica orrizzontale Dim areaW As Rectangle = New Rectangle(0, 0, immagineH.Width, immagineH.Height) ' area di lavoro LockBits Dim bmpDataW As Imaging.BitmapData = Nothing ' conterrà i dati della bitmap Dim ptrW As IntPtr ' conterrà l'indirizzo di memoria Dim bytesW As Integer ' conterrà la dimensione del vettore Dim colorValuesW() 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) bmpDataH = immagineH.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineH.PixelFormat) ptrH = bmpDataH.Scan0 bytesH = Math.Abs(bmpDataH.Stride) * immagineH.Height ReDim colorValuesH(bytesH - 1) ' vettore vuoto origineH = 0 'queste sono le dimensioni della grafica bianca origineW = 0 fineH = altezzapixel - frontestampa rettangolo(origineW, origineH, fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 0) 'rettangolo bianco rettangolo(gappixel, gappixel, fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 7) 'rettangolo nero rettangolo((gappixel + framepixel), (gappixel + framepixel), fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 0) 'rettangolo bianco System.Runtime.InteropServices.Marshal.Copy(colorValuesH, 0, ptrH, bytesH) immagineH.UnlockBits(bmpDataH) 'sblocco bit immagineH.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\latosx.bmp", Imaging.ImageFormat.Bmp) immagineH.Dispose() Case 1 'primo lato orrizzontale (superiore) bmpDataW = immagineW.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineW.PixelFormat) ptrW = bmpDataW.Scan0 bytesW = Math.Abs(bmpDataW.Stride) * immagineW.Height ReDim colorValuesW(bytesH - 1) 'un vettore adeguato con tutti zeri (bianco) origineH = 0 'queste sono le dimensioni della grafica bianca origineW = 0 fineH = larghezzapixel - frontestampa rettangolo(origineW, origineH, fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesW, 0) 'rettangolo bianco rettangolo(gappixel, gappixel, fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesW, 7) 'rettangolo nero rettangolo((gappixel + framepixel), (gappixel + framepixel), fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesW, 0) 'rettangolo bianco System.Runtime.InteropServices.Marshal.Copy(colorValuesW, 0, ptrW, bytesW) immagineW.UnlockBits(bmpDataW) 'sblocco bit immagineW.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\superiore.bmp", Imaging.ImageFormat.Bmp) immagineW.Dispose() Case 2 'secondo lato verticale (lato destro) 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 (bianco) origineH = 0 'queste sono le dimensioni della grafica bianca origineW = 0 rettangolo(origineW, origineH, fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 0) 'rettangolo bianco rettangolo(gappixel, gappixel, fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 7) 'rettangolo nero rettangolo((gappixel + framepixel), (gappixel + framepixel), fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 0) 'rettangolo bianco System.Runtime.InteropServices.Marshal.Copy(colorValuesH, 0, ptrH, bytesH) immagineH.UnlockBits(bmpDataH) 'sblocco bit immagineH.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\latodx.bmp", Imaging.ImageFormat.Bmp) immagineH.Dispose() Case 3 'secondo lato orrizzontale (base) bmpDataW = immagineW.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineW.PixelFormat) ptrW = bmpDataW.Scan0 bytesW = Math.Abs(bmpDataW.Stride) * immagineW.Height ReDim colorValuesW(bytesW - 1) 'un vettore adeguato con tutti zeri (bianco) origineH = 0 'queste sono le dimensioni della grafica bianca origineW = 0 rettangolo(origineW, origineH, fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesH, 0) 'rettangolo bianco rettangolo(gappixel, gappixel, fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesH, 7) 'rettangolo nero rettangolo((gappixel + framepixel), (gappixel + framepixel), fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesW, 0) 'rettangolo bianco System.Runtime.InteropServices.Marshal.Copy(colorValuesW, 0, ptrW, bytesW) immagineW.UnlockBits(bmpDataW) 'sblocco bit immagineW.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\base.bmp", Imaging.ImageFormat.Bmp) immagineW.Dispose() Case 4 'una elle rovesciata nera 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 (bianco) rettangolo(200, 500, fineW, 700, bmpDataH.Stride, immagineH.Height, colorValuesH, 7) 'rettangolo nero rettangolo(200, 700, 400, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 7) 'rettangolo nero System.Runtime.InteropServices.Marshal.Copy(colorValuesH, 0, ptrH, bytesH) immagineH.UnlockBits(bmpDataH) 'sblocco bit immagineH.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\elle rovesciata.bmp", Imaging.ImageFormat.Bmp) immagineH.Dispose() End Select 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
aaa