Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - File bmp
Forum - C# / VB.NET - File bmp - Pagina 12

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ] Precedente | Prossimo
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 18:02
Martedì, 10/08/2021
Io sono aperto a tutti i suggerimenti.
La ragione  dei due rettangoli sovrapposti per creare la L rovesciata era per semplificare, per descrivere il rettangolo dichiariamo l'angolo in alto a sinistra , e questo cambia , l'angolo inferiore destro , e questo è lo stesso per i due rettangoli e le due dimensioni .
Creare la L in altra maniera , mi sembrava più complicato , e comunque sempre 2 rettangoli bisogna creare .
L'unico valore costante è la larghezza del primo rettangolo , quella è fissa , ma tutti gli altri valori possono cambiare.

PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 18:38
Martedì, 10/08/2021
Però , facendo la modifica "Dim ind As UInt32 = colonna + riga * bmpData.Stride" adesso non va bene , mi perdo completamente lo sfondo bianco .
La L rovesciata ora è grande come tutta la grafica , ma non deve essere così .

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:44
Martedì, 10/08/2021
Esatto, i valori li modifichi a piacere, se ti resta comodo sovrascrivere i rettangoli, ed il tempo impiegato ti va bene, OK.
Se l'immagine è mooolto grande disegnado due rettangoli uno orizzontale e uno verticale attaccati, scrivi molti meno byte e il tempo diminuisce.
Queste scelte non modificano le stesura del codice che è sempre buono.
Non ho capito bene cosa volevi disegnare, ho aggiunto un Case 4 che disegna una elle rovesciata a partire da coordinate mie di fantasia, fino al bordo destro fineW e alta come il valore da te calcolato in fineH, naturalmente i valori li puoi anche passare con delle variabili modificabili dall'utente:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  2.         ' Valori impostabili
  3.         Dim larghezzamm = 1000
  4.         Dim altezzamm = 2000
  5.         Dim framemm = 65
  6.         Dim gapmm = 5
  7.         Dim mmpixel = 14.17
  8.         Dim nteste = 1
  9.         Dim larghezzapixel = Math.Truncate(larghezzamm * mmpixel) - 1                         'converto le dimensioni del pannello da mm a pixel
  10.         Dim altezzapixel = Math.Truncate(altezzamm * mmpixel) - 1
  11.         Dim framepixel = Math.Truncate(framemm * mmpixel) - 1
  12.         Dim gappixel = Math.Truncate(gapmm * mmpixel) - 1
  13.         Dim frontestampa = (1000 * nteste) - 1
  14.         Dim origineH, origineW, fineH, fineW As Double
  15.         Dim nome As String = ""
  16.         fineW = frontestampa
  17.  
  18.         ' una volta definiti i valori l'immagine non cambierà più in dimensioni
  19.         Dim immagine As New Bitmap(fineW, altezzapixel - frontestampa, Imaging.PixelFormat.Format4bppIndexed)
  20.         immagine.SetResolution(360, 360)
  21.         ' creo una palette con 8 livelli di grigio invertita
  22.         Dim palette As Imaging.ColorPalette = immagine.Palette
  23.         For i = 0 To palette.Entries.Length - 1
  24.             If i > 7 Then
  25.                 palette.Entries(i) = Color.White
  26.             Else
  27.                 palette.Entries(i) = Color.FromArgb(255 - i * 36.4, 255 - i * 36.4, 255 - i * 36.4)
  28.             End If
  29.         Next i
  30.         ' associo la palette creata alla bitmap 4bpp,
  31.         ' i valori 0...7 ora corrispondono alla scala dal bianco al nero
  32.         immagine.Palette = palette
  33.  
  34.         Dim area As Rectangle = New Rectangle(0, 0, immagine.Width, immagine.Height) ' area di lavoro LockBits
  35.         Dim bmpData As Imaging.BitmapData = Nothing ' conterrà i dati della bitmap
  36.         Dim ptr As IntPtr ' conterrà l'indirizzo di memoria
  37.         Dim bytes As Integer ' conterrà la dimensione del vettore  
  38.         Dim colorValues() As Byte = Nothing ' conterrà il vettore
  39.  
  40.         ' ad ogni case, il vettore e la bitmap vengono reinizializzati
  41.         For i = 0 To 4
  42.             Select Case i
  43.  
  44.                 Case 0                                  'primo lato verticale (lato sinistro)
  45.                     bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat)
  46.                     ptr = bmpData.Scan0
  47.                     bytes = Math.Abs(bmpData.Stride) * immagine.Height
  48.                     ReDim colorValues(bytes - 1) ' vettore vuoto
  49.                     origineH = 0                        'queste sono le dimensioni della grafica bianca
  50.                     origineW = 0
  51.                     fineH = altezzapixel - frontestampa
  52.                     nome = "latosx"
  53.                     rettangolo(origineW, origineH, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 0)           ' rettangolo bianco
  54.                     rettangolo(gappixel, gappixel, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 7)          ' rettangolo nero
  55.  
  56.                 Case 1                                  'primo lato orrizzontale (superiore)
  57.                     bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat)
  58.                     ptr = bmpData.Scan0
  59.                     bytes = Math.Abs(bmpData.Stride) * immagine.Height
  60.                     ReDim colorValues(bytes - 1) ' un vettore adeguato con tutti zeri (bianco)
  61.                     origineH = 0                        'queste sono le dimensioni della grafica bianca
  62.                     origineW = 0
  63.                     fineH = larghezzapixel - frontestampa
  64.                     nome = "superiore"
  65.                     rettangolo(origineW, origineH, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 0)           ' rettangolo bianco
  66.                     rettangolo(gappixel, gappixel, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 7)          ' rettangolo nero
  67.  
  68.                 Case 2                                  'secondo lato verticale (lato destro)
  69.                     bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat)
  70.                     ptr = bmpData.Scan0
  71.                     bytes = Math.Abs(bmpData.Stride) * immagine.Height
  72.                     ReDim colorValues(bytes - 1) ' un vettore adeguato con tutti zeri (bianco)
  73.                     origineH = 0                        'queste sono le dimensioni della grafica bianca
  74.                     origineW = 0
  75.                     nome = "latodx"
  76.                     rettangolo(origineW, origineH, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 0)           ' rettangolo bianco
  77.                     rettangolo(gappixel, gappixel, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 7)          ' rettangolo nero
  78.  
  79.                 Case 3                                  'secondo lato orrizzontale (base)
  80.                     bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat)
  81.                     ptr = bmpData.Scan0
  82.                     bytes = Math.Abs(bmpData.Stride) * immagine.Height
  83.                     ReDim colorValues(bytes - 1) ' un vettore adeguato con tutti zeri (bianco)
  84.                     origineH = 0                        'queste sono le dimensioni della grafica bianca
  85.                     origineW = 0
  86.                     nome = "base"
  87.                     rettangolo(origineW, origineH, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 0)           ' rettangolo bianco
  88.                     rettangolo(gappixel, gappixel, fineW, fineH, bmpData.Stride, immagine.Height, colorValues, 7)          ' rettangolo nero
  89.  
  90.                 Case 4                                  'una elle rovesciata nera
  91.                     bmpData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat)
  92.                     ptr = bmpData.Scan0
  93.                     bytes = Math.Abs(bmpData.Stride) * immagine.Height
  94.                     ReDim colorValues(bytes - 1) ' un vettore adeguato con tutti zeri (bianco)
  95.                     nome = "elle rovesciata"
  96.                     rettangolo(200, 500, fineW, 700, bmpData.Stride, immagine.Height, colorValues, 7) ' rettangolo nero
  97.                     rettangolo(200, 700, 400, fineH, bmpData.Stride, immagine.Height, colorValues, 7) ' rettangolo nero
  98.             End Select
  99.  
  100.             ' al termine di ogni case il vettore creato viene copiato nella bitmap, e poi sbloccata per il salvataggio
  101.             System.Runtime.InteropServices.Marshal.Copy(colorValues, 0, ptr, bytes)
  102.             immagine.UnlockBits(bmpData)                                                'sblocco bit
  103.             immagine.Save("C:\" & nome & ".bmp", Imaging.ImageFormat.Bmp)
  104.             immagine.Save("C:\" & name & ".tiff", Imaging.ImageFormat.Tiff)
  105.  
  106.         Next
  107.  
  108.     End Sub
  109.  
  110.     ' traccia un rettangolo data la sua diagonale, prima coordinata x1,y1 seconda coordinata x2,y2
  111.     ' la larghezza e l'altezza servono per calcolare l'indice e limitare valori fuori range,
  112.     ' non devono differire dalla dimensione del vettore da bitmap. larghezza = bmpData.Stride, altezza = immagine.Height
  113.     ' il vettore va passato per fare in modo che i rettangoli siano scritti nella stessa area grafica
  114.     ' 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
  115.     ' i valori 8...15 se usati daranno un bianco.
  116.     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)
  117.         ' limite valori
  118.         x1 = Math.Truncate(x1 / 2)
  119.         x2 = Math.Truncate(x2 / 2)
  120.         If x1 >= larghezza Then x1 = larghezza - 1
  121.         If x2 >= larghezza Then x2 = larghezza - 1
  122.         If y1 >= altezza Then y1 = altezza - 1
  123.         If y2 >= altezza Then y2 = altezza - 1
  124.         ' a 4bpp scrivo 2 pixel adiacenti alla volta
  125.         colore = colore + colore * 16 ' valore per due pixel uguali
  126.         For colonna As UInt32 = x1 To x2
  127.             For riga As UInt32 = y1 To y2
  128.                 Dim ind As UInt32 = colonna + riga * larghezza  'calcolo l'indice
  129.                 vettore(ind) = colore
  130.             Next
  131.         Next
  132.     End Sub



Spero che lo troverai utile... :rotfl:


Ultima modifica effettuata da Carlo il 10/08/2021 alle 19:16


in programmazione tutto è permesso
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 18:51
Martedì, 10/08/2021
Allego il risultato con la modifica, ma non va bene , ho bisogno che sia come l'esempio postato .
Considerando che le grafiche sono 2 ed una delle dimensioni ( la larghezza) è sempre costante , potrei creare le due grafiche, passarne una alla funzione che crea il primo rettangolo, fare la seconda chiamata e poi salvare nel case e non nella funzione .
Così facendo dovrei risolvere il problema . Corretto?


bernie ha allegato un file: Carlo2.png (2552 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:57
Martedì, 10/08/2021
Abbiamo scritto insieme, il tuo codice come ti ho detto, senza modifiche ti mostrerà sempre e solo l'ultimo rettangolo disegnato.
Ti ho postato le correzioni guarda due post più su.

Ultima modifica effettuata da Carlo il 10/08/2021 alle 18:58


in programmazione tutto è permesso
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 20:01
Martedì, 10/08/2021
Ho provato il tuo esempio e si ferma al case 0  e non è una L rovesciata.
Ho provato anche il case 4 rinominandolo in 0 , ma stessa cosa , non è una L rovesciata.
L'altro problema è che le grafiche non sono tutte uguali in dimensioni , solo la larghezza è sempre uguale , l'altezza ha due valori, nei case 0 e 2 l'altezza sarà il valore di altezzamm , nei case 1 e 3 l'altezza sarà il valore larghezzamm. Questo si risolve facilmente , creando due immagini immagineH ed immagineW e nei case usare quella specifica.
Non capisco perchè non cicla i case.
Ci studio un po sopra.
Grazie

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:32
Martedì, 10/08/2021
Testo quotato

Postato originariamente da bernie:

Ho provato il tuo esempio e si ferma al case 0  e non è una L rovesciata.
Ho provato anche il case 4 rinominandolo in 0 , ma stessa cosa , non è una L rovesciata.
L'altro problema è che le grafiche non sono tutte uguali in dimensioni , solo la larghezza è sempre uguale , l'altezza ha due valori, nei case 0 e 2 l'altezza sarà il valore di altezzamm , nei case 1 e 3 l'altezza sarà il valore larghezzamm. Questo si risolve facilmente , creando due immagini immagineH ed immagineW e nei case usare quella specifica.
Non capisco perchè non cicla i case.
Ci studio un po sopra.
Grazie  


Ti allego il progetto, le immagini vengono salvate nel percorso dell'eseguibile: ...\BMP_4_Bpp_2\BMP_4_Bpp_2\bin\Debug\
Le grafiche devono cambiare in altezza?
allora deve essere ridichiarata anche la bitmap, oppure come dici tu ne dichiari 2.
Lavoraci un po' le info ce le hai tutte fai sapere.


Carlo ha allegato un file: BMP_4_Bpp_2.zip (28722 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 10/08/2021 alle 20:36


in programmazione tutto è permesso
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 20:58
Martedì, 10/08/2021
Io ho fatto così, non è elegante e sicuramente si può ottimizzare , però funziona .
Comunque non cicla i case
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  2.         ' Valori impostabili
  3.         Dim larghezzamm = 1000
  4.         Dim altezzamm = 2000
  5.         Dim framemm = 70
  6.         Dim gapmm = 70
  7.         Dim mmpixel = 14.17
  8.         Dim nteste = 3
  9.         Dim larghezzapixel = Math.Truncate(larghezzamm * mmpixel) - 1                         'converto le dimensioni del pannello da mm a pixel
  10.         Dim altezzapixel = Math.Truncate(altezzamm * mmpixel) - 1
  11.         Dim framepixel = Math.Truncate(framemm * mmpixel) - 1
  12.         Dim gappixel = Math.Truncate(gapmm * mmpixel) - 1
  13.         Dim frontestampa = (1000 * nteste) - 1
  14.         Dim origineH, origineW, fineH, fineW As Double
  15.         'Dim nome As String = ""
  16.         fineW = frontestampa
  17.  
  18.         ' una volta definiti i valori l'immagine non cambierà più in dimensioni
  19.         Dim immagineH As New Bitmap(fineW, altezzapixel - frontestampa, Imaging.PixelFormat.Format4bppIndexed)      'immagine per l'altezza
  20.         immagineH.SetResolution(360, 360)
  21.         Dim immagineW As New Bitmap(fineW, larghezzapixel - frontestampa, Imaging.PixelFormat.Format4bppIndexed)    'immagine per la larghezza
  22.         immagineW.SetResolution(360, 360)
  23.         ' creo una palette con 8 livelli di grigio invertita
  24.         Dim palette As Imaging.ColorPalette = immagineH.Palette
  25.         For i = 0 To palette.Entries.Length - 1
  26.             If i > 7 Then
  27.                 palette.Entries(i) = Color.White
  28.             Else
  29.                 palette.Entries(i) = Color.FromArgb(255 - i * 36.4, 255 - i * 36.4, 255 - i * 36.4)
  30.             End If
  31.         Next i
  32.         ' associo la palette creata alla bitmap 4bpp,
  33.         ' i valori 0...7 ora corrispondono alla scala dal bianco al nero
  34.         immagineH.Palette = palette
  35.         immagineW.Palette = palette
  36.         '**************creo la grafica verticale
  37.         Dim areaH As Rectangle = New Rectangle(0, 0, immagineH.Width, immagineH.Height) ' area di lavoro LockBits
  38.         Dim bmpDataH As Imaging.BitmapData = Nothing ' conterrà i dati della bitmap
  39.         Dim ptrH As IntPtr ' conterrà l'indirizzo di memoria
  40.         Dim bytesH As Integer ' conterrà la dimensione del vettore  
  41.         Dim colorValuesH() As Byte = Nothing ' conterrà il vettore
  42.         '**************creo la grafica orrizzontale
  43.         Dim areaW As Rectangle = New Rectangle(0, 0, immagineH.Width, immagineH.Height) ' area di lavoro LockBits
  44.         Dim bmpDataW As Imaging.BitmapData = Nothing ' conterrà i dati della bitmap
  45.         Dim ptrW As IntPtr ' conterrà l'indirizzo di memoria
  46.         Dim bytesW As Integer ' conterrà la dimensione del vettore  
  47.         Dim colorValuesW() As Byte = Nothing ' conterrà il vettore
  48.  
  49.         ' ad ogni case, il vettore e la bitmap vengono reinizializzati
  50.         For i = 0 To 4
  51.             Select Case i
  52.  
  53.                 Case 0                                  'primo lato verticale (lato sinistro)
  54.                     bmpDataH = immagineH.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineH.PixelFormat)
  55.                     ptrH = bmpDataH.Scan0
  56.                     bytesH = Math.Abs(bmpDataH.Stride) * immagineH.Height
  57.                     ReDim colorValuesH(bytesH - 1)      ' vettore vuoto
  58.                     origineH = 0                        'queste sono le dimensioni della grafica bianca
  59.                     origineW = 0
  60.                     fineH = altezzapixel - frontestampa
  61.                     rettangolo(origineW, origineH, fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 0)           'rettangolo bianco
  62.                     rettangolo(gappixel, gappixel, fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 7)           'rettangolo nero
  63.                     rettangolo((gappixel + framepixel), (gappixel + framepixel), fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 0)            'rettangolo bianco
  64.                     System.Runtime.InteropServices.Marshal.Copy(colorValuesH, 0, ptrH, bytesH)
  65.                     immagineH.UnlockBits(bmpDataH)                                                'sblocco bit
  66.                     immagineH.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\latosx.bmp", Imaging.ImageFormat.Bmp)
  67.                     immagineH.Dispose()
  68.                 Case 1                                  'primo lato orrizzontale (superiore)
  69.                     bmpDataW = immagineW.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineW.PixelFormat)
  70.                     ptrW = bmpDataW.Scan0
  71.                     bytesW = Math.Abs(bmpDataW.Stride) * immagineW.Height
  72.                     ReDim colorValuesW(bytesH - 1)      'un vettore adeguato con tutti zeri (bianco)
  73.                     origineH = 0                        'queste sono le dimensioni della grafica bianca
  74.                     origineW = 0
  75.                     fineH = larghezzapixel - frontestampa
  76.                     rettangolo(origineW, origineH, fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesW, 0)           'rettangolo bianco
  77.                     rettangolo(gappixel, gappixel, fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesW, 7)           'rettangolo nero
  78.                     rettangolo((gappixel + framepixel), (gappixel + framepixel), fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesW, 0)            'rettangolo bianco
  79.                     System.Runtime.InteropServices.Marshal.Copy(colorValuesW, 0, ptrW, bytesW)
  80.                     immagineW.UnlockBits(bmpDataW)                                                'sblocco bit
  81.                     immagineW.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\superiore.bmp", Imaging.ImageFormat.Bmp)
  82.                     immagineW.Dispose()
  83.                 Case 2                                  'secondo lato verticale (lato destro)
  84.                     bmpDataH = immagineH.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineH.PixelFormat)
  85.                     ptrH = bmpDataH.Scan0
  86.                     bytesH = Math.Abs(bmpDataH.Stride) * immagineH.Height
  87.                     ReDim colorValuesH(bytesH - 1)      'un vettore adeguato con tutti zeri (bianco)
  88.                     origineH = 0                        'queste sono le dimensioni della grafica bianca
  89.                     origineW = 0
  90.                     rettangolo(origineW, origineH, fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 0)           'rettangolo bianco
  91.                     rettangolo(gappixel, gappixel, fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 7)           'rettangolo nero
  92.                     rettangolo((gappixel + framepixel), (gappixel + framepixel), fineW, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 0)            'rettangolo bianco
  93.                     System.Runtime.InteropServices.Marshal.Copy(colorValuesH, 0, ptrH, bytesH)
  94.                     immagineH.UnlockBits(bmpDataH)                                                'sblocco bit
  95.                     immagineH.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\latodx.bmp", Imaging.ImageFormat.Bmp)
  96.                     immagineH.Dispose()
  97.                 Case 3                                  'secondo lato orrizzontale (base)
  98.                     bmpDataW = immagineW.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineW.PixelFormat)
  99.                     ptrW = bmpDataW.Scan0
  100.                     bytesW = Math.Abs(bmpDataW.Stride) * immagineW.Height
  101.                     ReDim colorValuesW(bytesW - 1)      'un vettore adeguato con tutti zeri (bianco)
  102.                     origineH = 0                        'queste sono le dimensioni della grafica bianca
  103.                     origineW = 0
  104.                     rettangolo(origineW, origineH, fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesH, 0)           'rettangolo bianco
  105.                     rettangolo(gappixel, gappixel, fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesH, 7)           'rettangolo nero
  106.                     rettangolo((gappixel + framepixel), (gappixel + framepixel), fineW, fineH, bmpDataW.Stride, immagineW.Height, colorValuesW, 0)            'rettangolo bianco
  107.                     System.Runtime.InteropServices.Marshal.Copy(colorValuesW, 0, ptrW, bytesW)
  108.                     immagineW.UnlockBits(bmpDataW)                                                'sblocco bit
  109.                     immagineW.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\base.bmp", Imaging.ImageFormat.Bmp)
  110.                     immagineW.Dispose()
  111.                 Case 4                                  'una elle rovesciata nera
  112.                     bmpDataH = immagineH.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineH.PixelFormat)
  113.                     ptrH = bmpDataH.Scan0
  114.                     bytesH = Math.Abs(bmpDataH.Stride) * immagineH.Height
  115.                     ReDim colorValuesH(bytesH - 1)      'un vettore adeguato con tutti zeri (bianco)
  116.                     rettangolo(200, 500, fineW, 700, bmpDataH.Stride, immagineH.Height, colorValuesH, 7)                        'rettangolo nero
  117.                     rettangolo(200, 700, 400, fineH, bmpDataH.Stride, immagineH.Height, colorValuesH, 7)                        'rettangolo nero
  118.                     System.Runtime.InteropServices.Marshal.Copy(colorValuesH, 0, ptrH, bytesH)
  119.                     immagineH.UnlockBits(bmpDataH)                                                'sblocco bit
  120.                     immagineH.Save("C:\Users\briniluc\Desktop\DigitalFrame_Idee-concetti-varie\DigitalFrameColore\elle rovesciata.bmp", Imaging.ImageFormat.Bmp)
  121.                     immagineH.Dispose()
  122.             End Select
  123.  
  124.  
  125.  
  126.         Next
  127.  
  128.     End Sub
  129.  
  130.     ' traccia un rettangolo data la sua diagonale, prima coordinata x1,y1 seconda coordinata x2,y2
  131.     ' la larghezza e l'altezza servono per calcolare l'indice e limitare valori fuori range,
  132.     ' non devono differire dalla dimensione del vettore da bitmap. larghezza = bmpData.Stride, altezza = immagine.Height
  133.     ' il vettore va passato per fare in modo che i rettangoli siano scritti nella stessa area grafica
  134.     ' 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
  135.     ' i valori 8...15 se usati daranno un bianco.
  136.     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)
  137.         ' limite valori
  138.         x1 = Math.Truncate(x1 / 2)
  139.         x2 = Math.Truncate(x2 / 2)
  140.         If x1 >= larghezza Then x1 = larghezza - 1
  141.         If x2 >= larghezza Then x2 = larghezza - 1
  142.         If y1 >= altezza Then y1 = altezza - 1
  143.         If y2 >= altezza Then y2 = altezza - 1
  144.         ' a 4bpp scrivo 2 pixel adiacenti alla volta
  145.         colore = colore + colore * 16 ' valore per due pixel uguali
  146.         For colonna As UInt32 = x1 To x2
  147.             For riga As UInt32 = y1 To y2
  148.                 Dim ind As UInt32 = colonna + riga * larghezza  'calcolo l'indice
  149.                 vettore(ind) = colore
  150.             Next
  151.         Next
  152.     End Sub


PM Quote
Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ] Precedente | Prossimo