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 - modificare file BMP
Forum - C# / VB.NET - modificare file BMP - Pagina 5

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
Carlo (Member)
Guru


Messaggi: 1284
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:38
Domenica, 26/09/2021
Bene allora vai con l'Header con palette positiva: 0=Black, 255=White e scrivi i 255 che ti servono.


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


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 18:35
Martedì, 28/09/2021
Per adesso ho riempito il vettore di 255, poi disegno i vari rettangoli neri.

PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 8:55
Giovedì, 30/09/2021
Stavo guardando l'esempio di Carlo per stirare le grafiche senza usare GDI+, è possibile usare anche moltiplicatori non interi?

PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 17:33
Giovedì, 30/09/2021
Ho scritto in fretta, Carlo aveva scritto che era solo per numeri interi.
Ma oltre a stirare il bmp, posso anche ridurlo con la stessa maniera?
Invece di moltiplicare per il coefficiente dividere per il coefficiente?

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1284
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 22:25
Giovedì, 30/09/2021
Se si perfeziona il codice per farlo funzionare anche con i decimali anche la riduzione diventerà possibile.
Per ora non ci ho pensato su più di tanto, una soluzione lampante non mi è sovvenuta, bisogna ragionarci un po'.


in programmazione tutto è permesso
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1284
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 10:28
Venerdì, 01/10/2021
Ho introdotto un correttivo per far accettare anche i decimali, per avere uno zoom negativo si inserisce un valore minore di 1.
es: un valore di zoom 0.25 riduce di un quarto la dimensione.
Le variabili zoom dichiarate Single, nei cicli peggiorano un po' le prestazioni.

Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO
  2.  
  3. Public Class Form1
  4.     Dim sw As New Stopwatch
  5.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  6.         Dim NomeFileOriginale As String = "bandind2_BlackWhite.bmp"
  7.         Dim NomeFileStirato As String = "zoombandind2_BlackWhite.bmp"
  8.         Dim Originale As New Bitmap(NomeFileOriginale)
  9.         Dim paletteOriginale As Imaging.ColorPalette = Originale.Palette
  10.         Dim f As Integer = Originale.Palette.Flags '2=scalagrigio
  11.         Dim areaOriginale As New Rectangle(0, 0, Originale.Width, Originale.Height)
  12.         Dim bmpDataOriginale As Imaging.BitmapData = Originale.LockBits(areaOriginale, Imaging.ImageLockMode.ReadWrite, Originale.PixelFormat)
  13.         Dim ptrOriginale As IntPtr = bmpDataOriginale.Scan0 ' conterrà l'indirizzo di memoria
  14.         Dim bytesOriginale As Integer = Math.Abs(bmpDataOriginale.Stride) * Originale.Height
  15.         Dim levelValuesOriginale(bytesOriginale - 1) As Byte
  16.         System.Runtime.InteropServices.Marshal.Copy(ptrOriginale, levelValuesOriginale, 0, bytesOriginale)
  17.  
  18.         Dim ZoomH As Single = 6.3 ' zoom verticale
  19.         Dim ZoomW As Single = 4.2 ' zoom orizzontale
  20.  
  21.         Dim Stirata As New Bitmap(Originale.Width * ZoomW, Originale.Height * ZoomH, Imaging.PixelFormat.Format8bppIndexed)
  22.         Stirata.Palette = Originale.Palette
  23.  
  24.         Dim areaStirata As New Rectangle(0, 0, Stirata.Width, Stirata.Height)
  25.         Dim bmpDataStirata As Imaging.BitmapData = Stirata.LockBits(areaStirata, Imaging.ImageLockMode.ReadWrite, Stirata.PixelFormat)
  26.         Dim ptrStirata As IntPtr = bmpDataStirata.Scan0 ' conterrà l'indirizzo di memoria
  27.         Dim bytesStirata As Integer = Math.Abs(bmpDataStirata.Stride) * Stirata.Height
  28.         Dim levelValuesStirata(bytesStirata - 1) As Byte
  29.  
  30.         sw.Restart()
  31.  
  32.         ' lettura e scrittura con zoom impostato
  33.         Dim stepW As Single = ZoomW ' se lo zoom è decimale
  34.         Dim stepH As Single = ZoomH ' se lo zoom è decimale
  35.         If Math.Truncate(ZoomH) = ZoomH Then stepH = ZoomH - 1 ' se lo zoom non è decimale
  36.         If Math.Truncate(ZoomW) = ZoomW Then stepW = ZoomW - 1 ' se lo zoom non è decimale
  37.         For rig = 0 To Originale.Height - 1
  38.             Dim limite As UInt32 = rig * bmpDataOriginale.Stride
  39.             Dim rig2 As UInt32 = Math.Truncate(rig * ZoomH)
  40.             For col = 0 To Originale.Width - 1
  41.                 Dim indOriginale As UInt32 = col + limite
  42.                 Dim livello As Byte = levelValuesOriginale(indOriginale)
  43.                 Dim col2 As UInt32 = Math.Truncate(col * ZoomW)
  44.                 For H As Single = 0 To stepH
  45.                     For W As Single = 0 To stepW
  46.                         Dim indStirata As UInt32 = col2 + W + (rig2 + H) * bmpDataStirata.Stride ' calcolo l'indice
  47.                         If indStirata < bytesStirata Then levelValuesStirata(indStirata) = livello
  48.                     Next
  49.                 Next
  50.             Next
  51.         Next
  52.         Dim conciclo As Integer = sw.ElapsedMilliseconds
  53.         System.Runtime.InteropServices.Marshal.Copy(levelValuesStirata, 0, ptrStirata, bytesStirata)
  54.         Stirata.UnlockBits(bmpDataStirata) 'sblocco bit
  55.         Stirata.Save(NomeFileStirato, Imaging.ImageFormat.Bmp)
  56.  
  57.         ' copio tutto l'Header del file d'origine nel file stirato
  58.         Dim fsO As New FileStream(NomeFileOriginale, FileMode.Open, FileAccess.Read)
  59.         Dim fsS As New FileStream(NomeFileStirato, FileMode.Open, FileAccess.Write)
  60.         Dim br As New BinaryReader(fsO)
  61.         Dim bw As New BinaryWriter(fsS)
  62.         Dim Byteletto As Byte ' lettura Byte
  63.         ' copio pari pari l'header d'origine
  64.         Do While fsO.Position <= &H435 '  fino alla fine all HEX scelto, termine Header di un BMP
  65.             Byteletto = br.ReadByte() ' lettura byte dall'origine
  66.             bw.Seek(CInt(fsO.Position - 1), SeekOrigin.Begin) ' posizione di destinazione
  67.             bw.Write(Byteletto) ' scrittura del byte letto in pari posizione
  68.         Loop
  69.  
  70.         ' aggiusto i parametri che potrebbero essere variati
  71.         bw.Seek(&H2, SeekOrigin.Begin) ' in posizione &H2 = lunghezza file
  72.         bw.Write(fsS.Length) ' metto la lunghezza del file
  73.         bw.Seek(&H12, SeekOrigin.Begin) ' in posizione &H12 = larghezza
  74.         bw.Write(Stirata.Width) ' scrivo la larghezza
  75.         bw.Seek(&H16, SeekOrigin.Begin) ' in posizione &H16 = altezza
  76.         bw.Write(Stirata.Height) ' scrivo l'altezza
  77.         fsO.Close()
  78.         fsS.Close()
  79.  
  80.         Originale.UnlockBits(bmpDataOriginale)
  81.         Originale.Dispose()
  82.         Stirata.Dispose()
  83.  
  84.         Me.Text = conciclo
  85.  
  86.     End Sub
  87. End Class


Ultima modifica effettuata da Carlo il 01/10/2021 alle 13:22


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


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 9:32
Sabato, 02/10/2021
Ti riferisci al tempo di elaborazione?
Considerando che la grafica la devo stirare due volte,affettarla e a volte anche ruotarla, l'aumento di qualche secondo nel processo non è rilevante. Considerando che tutte queste operazioni non sono in streaming, il tempo di processo non è così limitativo.
Ho adattato il tuo esempio e dalle prime prove "va come una viola" ( espressione locale per dire che una cosa va benissimo)
Grazie, continuo fino al prossimo ostacolo.

PM Quote
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo