Oppure

Loading
10/08/21 14:13
Carlo
sono ancora più confuso. :pat:
Cancelliamo e torniamo alle descrizioni. Ho allegato un'immagine che per me rappresenta quello che dici.
Non capisco quale sia la connessione con l'immagine d'esempio che invece hai postato.

EDIT:
Forse ci sono arrivato, scusa, la elle rovesciata nera, originariamente era un rettangolo nero pieno che poi fai apparire come una elle rovesciata, disegnando in basso a destra il rettangolo bianco.

Ora è chiaro anche l'ultimo post.

E' sempre così? Visto che usi dimensioni enormi, disegnare quadrati sovrapposti non mi sembra logico, potresti disegnare due rettangoli disposti ad elle...

Comunque il programma non cambierebbe, saresti solo tu a dare gli imput giusti per disegnare rettangoli oppure quadrati sovrapposti.
Ultima modifica effettuata da Carlo 10/08/21 14:31
in programmazione tutto è permesso
10/08/21 16:02
bernie
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.
aaa
10/08/21 16:38
bernie
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ì .
aaa
10/08/21 16:44
Carlo
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:
    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


Spero che lo troverai utile... :rotfl:

Ultima modifica effettuata da Carlo 10/08/21 17:16
in programmazione tutto è permesso
10/08/21 16:51
bernie
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?
aaa
10/08/21 16:57
Carlo
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 10/08/21 16:58
in programmazione tutto è permesso
10/08/21 18:01
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
aaa
10/08/21 18:32
Carlo
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.
Ultima modifica effettuata da Carlo 10/08/21 18:36
in programmazione tutto è permesso