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 5

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ] Precedente | Prossimo
Avatar
Carlo (Member)
Guru


Messaggi: 1087
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 9:26
Giovedì, 22/07/2021
La via più semplice è salvarsi il link, finquando Pierotofy esiste e hai una connessione la discussione la trovi subito:
http://www.pierotofy.it/pages/extras/forum/viewtopic.php?f ...

Per avere la discussione archiviata e leggibile anche senza connessione a internet: con Mozilla Ctrl+s, salva la pagina visualizzata al momento, oppure  menù in alto a destra, tre righette orizzontali: Salva pagina con nome.

Tutto l'Html, le immagini, i CSS e i js, vengono organizzati in cartelle e all'esterno della cartella ci sarà un file htm apribile con un browser.
Devi tenere presente che potrai scorrere tutta la pagina salvata e copiare eventuali testi di interesse, ma se clicchi qualsiasi collegamento o tastino verrà aperto il link reale alla pagina internet, che se presente funzionerà regolarmente, ma non sarai più nella tua pagina salvata.
Questo implica che per salvare questa discussione dovrai effettuare 5 salvataggi, uno per ogni pagina e che eventuali allegati li dovrai scaricare separatamente per averli disponibili senza internet attivo.

Ultima modifica effettuata da Carlo il 22/07/2021 alle 9:32


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


Messaggi: 149
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 11:40
Giovedì, 22/07/2021
Capito, probabilmente salvero tutto off line.
Ho trovato questo esempio online per ridimensionare una grafica
Codice sorgente - presumibilmente VB.NET

  1. Public Shared Function ResizeImage(img As Image, width As Integer, height As Integer) As Image
  2.     Dim newImage = New Bitmap(width, height)
  3.     Using gr = Graphics.FromImage(newImage)
  4.         gr.SmoothingMode = SmoothingMode.HighQuality
  5.         gr.InterpolationMode = InterpolationMode.HighQualityBicubic
  6.         gr.PixelOffsetMode = PixelOffsetMode.HighQuality
  7.         gr.DrawImage(img, New Rectangle(0, 0, width, height))
  8.     End Using
  9.     Return newImage
  10. End Function
  11.  
  12. Public Shared Function ResizeImage(img As Image, size As Size) As Image
  13.     Return ResizeImage(img, size.Width, size.Height)
  14. End Function
  15.  
  16. Public Shared Function ResizeImage(bmp As Bitmap, width As Integer, height As Integer) As Image
  17.     Return ResizeImage(DirectCast(bmp, Image), width, height)
  18. End Function
  19.  
  20. Public Shared Function ResizeImage(bmp As Bitmap, size As Size) As Image
  21.     Return ResizeImage(DirectCast(bmp, Image), size.Width, size.Height)
  22. End Function


Mi aiuteresti a capirlo?
Il mio scopo è di ingrandire una grafica, a volte solo una dimensione, altre volte entrambe le dimensioni ma con ratio differente.
Grazie

Ultima modifica effettuata da bernie il 22/07/2021 alle 11:40
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1087
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 19:52
Giovedì, 22/07/2021
Testo quotato

Postato originariamente da bernie:
Codice sorgente - presumibilmente VB.NET

  1. Public Shared Function ResizeImage(img As Image, width As Integer, height As Integer) As Image
  2.     Dim newImage = New Bitmap(width, height) ' nuova bmp con le dimensioni finali date
  3.     Using gr = Graphics.FromImage(newImage) ' layer grafico che permette la scrittura in newImage con le istruzioni GDI+
  4.         gr.SmoothingMode = SmoothingMode.HighQuality ' qualità delle trasformazioni grafiche
  5.         gr.InterpolationMode = InterpolationMode.HighQualityBicubic ' tipologia dell'algoritmo di ridimensionamento
  6.         gr.PixelOffsetMode = PixelOffsetMode.HighQuality ' precisione dei calcoli di un singolo pixel
  7.         gr.DrawImage(img, New Rectangle(0, 0, width, height)) ' nel layer grafico viene disegnata l'immagine img in posizione 0,0 ridimensionata in width, height
  8.     End Using
  9.     Return newImage ' newImage ora contiene img con le nuove dimensioni
  10. End Function


Mi aiuteresti a capirlo?
Il mio scopo è di ingrandire una grafica, a volte solo una dimensione, altre volte entrambe le dimensioni ma con ratio differente.
Grazie



Ti ho remmato il siglificato delle righe, ma questa è un'altra domanda, non è più pertinente in questa discussione

Ultima modifica effettuata da Carlo il 23/07/2021 alle 15:55


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


Messaggi: 149
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 20:36
Venerdì, 23/07/2021
Hai ragione, scusa per OT.
Ritornando in tema, quando rimappiamo una palette 256 toni in una a 16, la divisione è a step di 16. Io però anche avendo un 4bpp devo usare solo 8 livelli, quindi il quarto bit dovrebbe sempre essere a 0, quindi step di 32. E nel caso che non volessi una suddivisione lineare?

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1087
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:55
Venerdì, 23/07/2021
una palette lineare a tre bit (nero...bianco):
Codice sorgente - presumibilmente VB.NET

  1. 'creo la palette scala di grigio 3bit
  2.         Dim palette As Imaging.ColorPalette = clone4bpp.Palette
  3.         For i = 0 To palette.Entries.Length - 1
  4.             If i > 7 Then
  5.                 palette.Entries(i) = Color.Black
  6.             Else
  7.                 palette.Entries(i) = Color.FromArgb(i * 36.4, i * 36.4, i * 36.4)
  8.             End If
  9.         Next i


i livelli oltre il 7 conterranno (0,0,0), esistono ma li puoi ignorare

una palette di grigi non lineari arbitrari:
Codice sorgente - presumibilmente C# / VB.NET

  1. 'creo la palette scala di grigio 3bit
  2. Dim palette As Imaging.ColorPalette = clone4bpp.Palette
  3. palette.Entries(0) = Color.FromArgb(0, 0, 0)
  4. palette.Entries(1) = Color.FromArgb(10, 10, 10)
  5. palette.Entries(2) = Color.FromArgb(20, 20, 20)
  6. palette.Entries(3) = Color.FromArgb(30, 30, 30)
  7. palette.Entries(4) = Color.FromArgb(100, 100, 100)
  8. palette.Entries(5) = Color.FromArgb(101, 101, 101)
  9. palette.Entries(6) = Color.FromArgb(200, 200, 200)
  10. palette.Entries(7) = Color.FromArgb(255, 255, 255)


i livelli 0...7 li inventi tu l'essenziale è che i tre valori RGB siano uguali per ottenere un grigio
i livelli oltre il 7 li puoi azzerare o lasciare come sono

Ultima modifica effettuata da Carlo il 24/07/2021 alle 10:49


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


Messaggi: 149
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 11:52
Lunedì, 26/07/2021
Quando rimappo una grafica con palette da 8bpp a 4bpp come avviene la cosa ? raggruppa n colori e li associa al nuovo colore ?
Per esempio da 255 a 230 diventa 15 , da 229 a 200 diventa 14 e via così?


PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1087
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:14
Lunedì, 26/07/2021
Non so di preciso come funziona so che di default da 8bpp a 4bpp è molto grossolano, ci dovrebbero essere delle istruzioni per rimappare la palette e quantizzarla per ottenere risultati molto raffinati, in GDI+ c'è anche colorMatrix.

La cosa si può fare anche a mano usando le conoscenze di base.
Apri un nuovo progetto WinForm e nel form metti due picturebox affiancate.
La prima parte del codice crea un'immagine con una sfumatura da 256 livelli di grigio e i dati sono contenuti nel vettore colorValues
La seconda parte del codice crea un'immagine vuota con palette a 16 livelli di grigio e i dati sono contenuti nel vettore vuoto levelValues
La terza parte del codice legge colorValues e lo usa per scrivere con palette scalata in levelValues
La quarta parte del codice mette i dati contenuti nei vettori creati in bmp8bpp e bmp4bpp, per mostrarli su due picturebox
Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  3.  
  4.         Dim bmp8bpp As New Bitmap(255, 255, Imaging.PixelFormat.Format8bppIndexed) ' immagine 8bpp
  5.         ' blocco i bit della bitmap    
  6.         Dim area8 As Rectangle = New Rectangle(0, 0, bmp8bpp.Width, bmp8bpp.Height)
  7.         Dim bmpData8 As System.Drawing.Imaging.BitmapData = bmp8bpp.LockBits(area8, Drawing.Imaging.ImageLockMode.ReadWrite, bmp8bpp.PixelFormat)
  8.  
  9.         ' creo una palette con 256 livelli di grigio
  10.         Dim palette256 As Imaging.ColorPalette = bmp8bpp.Palette
  11.         For i = 0 To palette256.Entries.Length - 1
  12.             palette256.Entries(i) = Color.FromArgb(i, i, i)
  13.         Next i
  14.         ' associo la palette creata alla bitmap 8bpp,
  15.         ' i valori 0...255 ora corrispondono alla scala dal nero al bianco
  16.         bmp8bpp.Palette = palette256
  17.         Dim ptr8 As IntPtr = bmpData8.Scan0 ' puntatore all'indirizzo di memoria del primo byte.
  18.         Dim bytes8 As Integer = Math.Abs(bmpData8.Stride) * bmp8bpp.Height ' calcolo dei bytes necessari
  19.         Dim colorValues(bytes8 - 1) As Byte ' un array che conterrà tutti i bytes della bitmap.
  20.         ' creo una sfumatura
  21.         For colonna = 0 To bmp8bpp.Width
  22.             For riga = 0 To Math.Abs(bmpData8.Stride) - 2
  23.                 Dim ind As Integer = colonna + riga * Math.Abs(bmpData8.Stride) 'calcolo l'indice
  24.                 ' per semplificare l'esempio, la bitmap è larga 256 pixel,
  25.                 ' la colonna viene usata anche per impostare il colore
  26.                 colorValues(ind) = colonna ' il valore di colonna come valore del byte di grigio 0...255
  27.             Next
  28.         Next
  29.  
  30.         ' dichiaro bmp4bpp
  31.         Dim bmp4bpp As New Bitmap(255, 255, Imaging.PixelFormat.Format4bppIndexed)
  32.         ' blocco i bit della bitmap    
  33.         Dim area4 As Rectangle = New Rectangle(0, 0, bmp4bpp.Width, bmp4bpp.Height)
  34.         Dim bmpData4 As System.Drawing.Imaging.BitmapData = bmp4bpp.LockBits(area4, Drawing.Imaging.ImageLockMode.ReadWrite, bmp4bpp.PixelFormat)
  35.         ' creo una palette con 16 livelli di grigio
  36.         Dim palette16 As Imaging.ColorPalette = bmp4bpp.Palette
  37.         For i = 0 To palette16.Entries.Length - 1
  38.             palette16.Entries(i) = Color.FromArgb(i * 17, i * 17, i * 17)
  39.         Next i
  40.         ' associo la palette creata alla bitmap 4bpp,
  41.         ' i valori 0...15 ora corrispondono alla scala dal nero al bianco
  42.         bmp4bpp.Palette = palette16
  43.         Dim ptr4 As IntPtr = bmpData4.Scan0
  44.         Dim bytes4 As Long = Math.Abs(bmpData4.Stride) * bmp4bpp.Height ' calcolo dei bytes necessari
  45.         Dim levelValues(bytes4 - 1) As Byte
  46.  
  47.         ' nel vettore che rappresenta bmp4bpp ci copio i dati dal vettore che rappresenta bmp8bpp, scalati
  48.         ' scorro tutto il vettore colorValues che rappresenta bmp8bpp
  49.         For ind = 0 To bytes8 - 1
  50.             ' il vettore levelValues che rappresenta bmp4bpp è lungo la metà rispetto a colorValues
  51.             ' il valore di un pixel di colorValues, in un byte replicato per due pixel
  52.             levelValues(ind \ 2) = (colorValues(ind) \ 16) + (colorValues(ind) \ 16) * 16
  53.         Next
  54.  
  55.         ' ripristino vettore su immagine
  56.         System.Runtime.InteropServices.Marshal.Copy(colorValues, 0, ptr8, bytes8)
  57.         bmp8bpp.UnlockBits(bmpData8) ' sblocco bit
  58.         PictureBox1.Width = bmp8bpp.Width
  59.         PictureBox1.Height = bmp8bpp.Height
  60.         PictureBox1.Image = bmp8bpp
  61.  
  62.         ' ripristino vettore su immagine
  63.         System.Runtime.InteropServices.Marshal.Copy(levelValues, 0, ptr4, bytes4)
  64.         bmp4bpp.UnlockBits(bmpData4) ' sblocco bit
  65.         PictureBox2.Left = PictureBox1.Left + PictureBox1.Width + 20
  66.         PictureBox2.Width = bmp4bpp.Width
  67.         PictureBox2.Height = bmp4bpp.Height
  68.         PictureBox2.Image = bmp4bpp
  69.  
  70.     End Sub
  71. End Class


niente di nuovo.
se ti servono più info su:
levelValues(ind \ 2) = (colorValues(ind) \ 16) + (colorValues(ind) \ 16) * 16
chiedi

Ultima modifica effettuata da Carlo il 26/07/2021 alle 15:07


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


Messaggi: 149
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 15:03
Lunedì, 26/07/2021
Io avevo fatto una cosa molto grossolana
Codice sorgente - presumibilmente VB.NET

  1. Dim originale As New Bitmap("C:\cerchiogreyscale8bpp.bmp")
  2.         Dim clonerettangolo As New Rectangle(0, 0, originale.Width, originale.Height)
  3.         Dim clone4bpp As Bitmap = originale.Clone(clonerettangolo, Imaging.PixelFormat.Format4bppIndexed)
  4.         'creo la palette scala di grigio
  5.         Dim palette As Imaging.ColorPalette = clone4bpp.Palette
  6.         For i = 0 To palette.Entries.Length - 1
  7.             If i > 7 Then
  8.                 palette.Entries(i) = Color.White
  9.             Else
  10.                 palette.Entries(i) = Color.FromArgb(255 - i * 36.4, 255 - i * 36.4, 255 - i * 36.4)
  11.             End If
  12.         Next i
  13.  
  14.         'associo la palette creata alla bitmap 4bpp,
  15.         'i valori 0...15 ora corrispondono alla scala dal nero al bianco
  16.         clone4bpp.Palette = palette
  17.  
  18.         ' blocco i bit della bitmap per poter lavorare direttamente su un vettore di bytes
  19.         Dim area As Rectangle = New Rectangle(0, 0, clone4bpp.Width, clone4bpp.Height)
  20.         Dim bmpData As Imaging.BitmapData = clone4bpp.LockBits(area, Imaging.ImageLockMode.ReadWrite, clone4bpp.PixelFormat)
  21.  
  22.         ' puntatore all'indirizzo di memoria del primo byte.
  23.         Dim ptr As IntPtr = bmpData.Scan0
  24.  
  25.         ' un vettore che conterrà tutti i bytes della bitmap.
  26.         Dim bytes As Long = Math.Abs(bmpData.Stride) * clone4bpp.Height ' calcolo dei bytes necessari
  27.         Dim colorValues(bytes - 1) As Byte
  28.         ' nel vettore colorValues metto i dati dalla locazione ptr che rappresentano clone4bpp
  29.         System.Runtime.InteropServices.Marshal.Copy(ptr, colorValues, 0, bytes)
  30.  
  31.  
  32.         For ind = 0 To bytes - 1
  33.             Dim primosemibyte As Byte = colorValues(ind) \ 16
  34.             Dim secondosemibyte As Byte = colorValues(ind) - primosemibyte * 16
  35.             'primobyte
  36.             If primosemibyte >= 0 And primosemibyte <= 7 Then
  37.                 primosemibyte = 7
  38.             ElseIf primosemibyte >= 8 And primosemibyte <= 53 Then
  39.                 primosemibyte = 6
  40.             ElseIf primosemibyte >= 54 And primosemibyte <= 89 Then
  41.                 primosemibyte = 5
  42.             ElseIf primosemibyte >= 90 And primosemibyte <= 125 Then
  43.                 primosemibyte = 4
  44.             ElseIf primosemibyte >= 126 And primosemibyte <= 161 Then
  45.                 primosemibyte = 3
  46.             ElseIf primosemibyte >= 162 And primosemibyte <= 197 Then
  47.                 primosemibyte = 2
  48.             ElseIf primosemibyte >= 198 And primosemibyte <= 233 Then
  49.                 primosemibyte = 1
  50.             ElseIf primosemibyte >= 234 Then
  51.                 primosemibyte = 0
  52.             End If
  53.             'secondobyte
  54.             If secondosemibyte >= 0 And secondosemibyte <= 7 Then
  55.                 primosemibyte = 7
  56.             ElseIf secondosemibyte >= 8 And secondosemibyte <= 53 Then
  57.                 primosemibyte = 6
  58.             ElseIf secondosemibyte >= 54 And secondosemibyte <= 89 Then
  59.                 primosemibyte = 5
  60.             ElseIf secondosemibyte >= 90 And secondosemibyte <= 125 Then
  61.                 primosemibyte = 4
  62.             ElseIf secondosemibyte >= 126 And secondosemibyte <= 161 Then
  63.                 primosemibyte = 3
  64.             ElseIf secondosemibyte >= 162 And secondosemibyte <= 197 Then
  65.                 primosemibyte = 2
  66.             ElseIf secondosemibyte >= 198 And secondosemibyte <= 233 Then
  67.                 secondosemibyte = 1
  68.             ElseIf secondosemibyte >= 234 Then
  69.                 secondosemibyte = 0
  70.             End If
  71.             colorValues(ind) = primosemibyte * 16 + secondosemibyte ' ricompongo il byte con i due pixel
  72.         Next
  73.         System.Runtime.InteropServices.Marshal.Copy(colorValues, 0, ptr, bytes)
  74.         clone4bpp.UnlockBits(bmpData) ' sblocco bit
  75.         clone4bpp.SetResolution(360, 360)
  76.         clone4bpp.Save("C:\remap8bppa3bpp.bmp", Imaging.ImageFormat.Bmp)
  77.        
  78.         clone4bpp.Dispose()
  79.     End Sub


In questa maniera posso decidere io che range di livelli originali associo al nuovo livello .
Quello che non ho capito è perchè nei toni medi , mi colora un pixel si e uno no .  

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