Oppure

Loading
10/08/21 18:58
bernie
Io ho fatto così, non è elegante e sicuramente si può ottimizzare , però funziona .
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
10/08/21 19:29
bernie
Nei case tranne case0 manca l'assegnazione del valore di fineH.
Adesso anche la tua idea funziona e in realtà facendo solo 2 chiamate invece di 3 , è più ottimizzato .
Però non cicla , e neanche il tuo progetto .
:-|
Ho provato ad eliminare il ciclo for e i case ( alla fine non servono a niente , tanto li deve fare tutti e quattro...) però anche così si blocca dopo il primo.
Ultima modifica effettuata da bernie 10/08/21 19:45
aaa
10/08/21 19:49
Carlo
Perché non ti cicla i case non lo so, comunque il programma non può funzionare ci sono vari errori:
riga 96 eliminare: immagineH.Dispose() ' non puoi distruggere immagineH se poi la vuoi riutilizzare

riga 98 errata: bmpDataW = immagineW.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineW.PixelFormat)
riga 98 esatta: bmpDataW = immagineW.LockBits(areaW, Imaging.ImageLockMode.ReadWrite, immagineW.PixelFormat)

riga 82 eliminare: immagineW.Dispose() ' non puoi distruggere immagineW se poi la vuoi riutilizzare
riga 67 eliminare: immagineH.Dispose() ' non puoi distruggere immagineH se poi la vuoi riutilizzare

riga 69 errata: bmpDataW = immagineW.LockBits(areaH, Imaging.ImageLockMode.ReadWrite, immagineW.PixelFormat)
riga 69 esatta: bmpDataW = immagineW.LockBits(areaW, Imaging.ImageLockMode.ReadWrite, immagineW.PixelFormat)

riga 43 errata: Dim areaW As Rectangle = New Rectangle(0, 0, immagineH.Width, immagineH.Height) ' area di lavoro LockBits
riga 43 esatta: Dim areaW As Rectangle = New Rectangle(0, 0, immagineW.Width, immagineW.Height) ' area di lavoro LockBits

Spero di averli ricordati tutti... Ma gli errori non te li segnala? lo sai usare il Debug?

dici che non cicla e invece ti da errore?
Il mio progetto che ti ho allegato con lo zip, deve funzionare, prova ed eseguire l'exe nella cartela ...bin\debug.

I case pensavo che li avevi messi perché poi avresti inserito delle scelte impostate dall'utente.
Ultima modifica effettuata da Carlo 10/08/21 20:02
in programmazione tutto è permesso
10/08/21 20:11
Carlo
anche riga 104 e riga 105 colorValuesH deve essere colorValuesW

il riferimento delle righe sono quelle dell'ultimo listato che hai pubblicato
Ultima modifica effettuata da Carlo 10/08/21 20:12
in programmazione tutto è permesso
10/08/21 20:19
bernie
In debug , non da errori , solo si fermava dopo aver salvato la prima grafica .
Ho eliminato i Dispose e fatto le correzioni dovute a distrazione e all'ora....
I Dispose li metto alla fine per liberare tutto , dopo che ho finito di usare le grafiche
Grazie , continuo domani
aaa
11/08/21 4:56
bernie
Dopo le modifiche funziona.
Ottimo, grazie.
A questo punto devo decidere se usare il sistema dei rettangoli sovrapposti( stile layers di Photoshop) oppure la valida opzione di Carlo. Quest'ultima divenne essere più snella come soluzione ma forse richiede più calcoli a monte.
Vediamo questa sera.
aaa
11/08/21 18:28
Carlo
Se le grafiche sono come quelle dei test, fare quadrati sovrapposti potrebbe andare bene, visti i tempi:

primo lato verticale (lato sinistro) tracciato in: 1627 ms
lato orizzontale (superiore) tracciato in: 188 ms
secondo lato verticale (lato destro) tracciato in: 216 ms
secondo lato orizzontale (base) tracciato in: 189 ms
una elle rovesciata nera tracciata in: 12 ms.

Nessun vantaggio avere un tempo di 12ms. rispetto a 216ms.

Invece se le grafiche sono da 250.000 pixel, come quelle che hai proposto in altri post, fare qualche calcolo in più per passare da 1,2 minuti a 6 secondi conviene. :yup:
Ultima modifica effettuata da Carlo 12/08/21 6:34
in programmazione tutto è permesso
11/08/21 19:34
bernie
Infatti, ho scelto la soluzione di creare la L rovesciata. Come calcoli sono uguali, quindi ben venga.
Adesso ho iniziato a lavorare sui livelli.
aaa