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 10

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


Messaggi: 1316
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 23:17
Sabato, 07/08/2021
Testo quotato

Postato originariamente da bernie:

Non sono quindi le operazioni che faccio alla grafica, ma il solo salvataggio.
Se creo una grafica bmp,4bpp,360x360dpi, posso ruotarla, ingrandirla, tagliarla senza che i parametri cambino, quando la vado a salvare devo specificare in che formato la voglio salvare.  


Esatto :k:
è un parametro del contenitore (formato) di salvataggio, non di come è reppresentata la bitmap internamente, se l'immagine è a 8bpp, sia che la salvi in TIF o che la salvi in BMP sempre a 8bpp resta, poi ci sono i contenitori (formati) che sono sempre a 24bpp come il JPG o 8bpp come il GIF, ecc.

Ultima modifica effettuata da Carlo il 07/08/2021 alle 23:45


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


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 8:37
Domenica, 08/08/2021
Quindi, visto che devo fare varie operazioni alla grafica prima di salvarla, sarebbe furbo usare un formato che non sia troppo pesante e poi solo alla fine convertirlo nel formato con le caratteristiche che mi servono.
Possibile?

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1316
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 13:11
Domenica, 08/08/2021
ci sono dei pro e dei contro.

se le operazioni sono di riscalatura, ritaglio, rotazioni non multiple di 90° con matenimento della qualità usando algoritmi di antialias e scalatura avanzati, si entra in un mondo dove la matematica avanzata la fa da padrone, non alla portata del programmatore medio.
per questo ci sono le GDI+ che contemplano praticamente tutto e ti risolvono i problemi. Ma come sai operano solo con immagini a pixel non indicizzati, nel tuo caso si impongono delle conversioni.

se le operazioni sono semplici, ma con parametri rigidi come i tuoi, forse conviene operare sui byte senza aiuti.

L'unico vero problema, ma forse sono io che non ho le competenze adeguate, è la creazione della palette personalizzata quando si converte un'immagine a pixel non indicizzati in un'immagine a pixel indicizzati.

Non va trascurato il tempo, se le immagini sono molto grandi, la conversione tra i formati di pixel è onerosa.

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


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


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 17:30
Domenica, 08/08/2021
Abbastanza chiaro.
Ho iniziato a scrivere il programma  sfruttando anche i preziosi insegnamenti di Carlo(grazie) ma ovviamente ci sono dei problemi che non capisco. Ho provato ogni singolo blocco del programma separatamente e funzionano tutti, adesso che li sto componendo , iniziano i problemi strani .
Allego il codice incriminato
Codice sorgente - presumibilmente VB.NET

  1. larghezzapixel = Math.Truncate(larghezzamm * mmpixel) - 1                         'converto le dimensioni del pannello da mm a pixel
  2.             altezzapixel = Math.Truncate(altezzamm * mmpixel) - 1
  3.             framepixel = Math.Truncate(framemm * mmpixel) - 1
  4.             gappixel = Math.Truncate(gapmm * mmpixel) - 1
  5.             frontestampa = (1000 * nteste) - 1
  6.             Dim origineH, origineW, fineH, fineW As Double
  7.             Dim nome As String
  8.             fineW = frontestampa
  9.            
  10.                 For i = 0 To 3
  11.                     Select Case i
  12.  
  13.                         Case 0                                  'primo lato verticale (lato sinistro)
  14.                             origineH = 0                        'queste sono le dimensioni della grafica bianca
  15.                             origineW = 0
  16.                             fineH = altezzapixel - frontestampa
  17.                             nome = "latosx"
  18.                             rettangolo(origineW, origineH, fineW, fineH, fineW, (altezzapixel - frontestampa), nome, 0)           ' rettangolo bianco
  19.                             rettangolo(gappixel, gappixel, fineW, fineH, fineW, (altezzapixel - frontestampa), nome, 15)          ' rettangolo nero
  20.  
  21.                         Case 1                                  'primo lato orrizzontale (superiore)
  22.                             origineH = 0                        'queste sono le dimensioni della grafica bianca
  23.                             origineW = 0
  24.                             fineH = larghezzapixel - frontestampa
  25.                             nome = "superiore"
  26.                             rettangolo(origineW, origineH, fineW, fineH, fineW, (larghezzapixel - frontestampa), nome, 0)           ' rettangolo bianco
  27.                             rettangolo(gappixel, gappixel, fineW, fineH, fineW, (larghezzapixel - frontestampa), nome, 15)          ' rettangolo nero
  28.  
  29.                         Case 2                                  'secondo lato verticale (lato destro)
  30.                             origineH = 0                        'queste sono le dimensioni della grafica bianca
  31.                             origineW = 0
  32.                             nome = "latodx"
  33.                             rettangolo(origineW, origineH, fineW, fineH, fineW, (altezzapixel - frontestampa), nome, 0)           ' rettangolo bianco
  34.                             rettangolo(gappixel, gappixel, fineW, fineH, fineW, (altezzapixel - frontestampa), nome, 15)          ' rettangolo nero
  35.  
  36.                         Case 3                                  'secondo lato orrizzontale (base)
  37.                             origineH = 0                        'queste sono le dimensioni della grafica bianca
  38.                             origineW = 0
  39.                             nome = "base"
  40.                             rettangolo(origineW, origineH, fineW, fineH, fineW, (larghezzapixel - frontestampa), nome, 0)           ' rettangolo bianco
  41.                             rettangolo(gappixel, gappixel, fineW, fineH, fineW, (larghezzapixel - frontestampa), nome, 15)          ' rettangolo nero
  42.  
  43.                     End Select
  44.  
  45.                 Next        
  46.            
  47.     End Sub
  48.  
  49.     Sub rettangolo(x1 As UInt32, y1 As UInt32, x2 As UInt32, y2 As UInt32, xgrafica As UInt32, ygrafica As UInt32, name As String, colore As Byte)
  50.         Dim immagine As New Bitmap(xgrafica, ygrafica, Imaging.PixelFormat.Format4bppIndexed)
  51.         immagine.SetResolution(360, 360)
  52.         ' creo una palette con 16 livelli di grigio
  53.         Dim palette As Imaging.ColorPalette = immagine.Palette
  54.         For i = 0 To palette.Entries.Length - 1
  55.             palette.Entries(i) = Color.FromArgb(i * 17, i * 17, i * 17)
  56.         Next i
  57.         ' associo la palette creata alla bitmap 4bpp,
  58.         ' i valori 0...15 ora corrispondono alla scala dal nero al bianco
  59.         immagine.Palette = palette
  60.         ' blocco i bit della bitmap per poter lavorare direttamente su un vettore di bytes
  61.         Dim area As Rectangle = New Rectangle(0, 0, immagine.Width, immagine.Height)
  62.         Dim bmpData As Imaging.BitmapData = immagine.LockBits(area, Imaging.ImageLockMode.ReadWrite, immagine.PixelFormat)
  63.  
  64.         ' puntatore all'indirizzo di memoria del primo byte.
  65.         Dim ptr As IntPtr = bmpData.Scan0
  66.  
  67.         ' un vettore che conterrà tutti i bytes della bitmap.
  68.         Dim bytes As Integer = Math.Abs(bmpData.Stride) * immagine.Height                       ' calcolo dei bytes necessari
  69.         Dim colorValues(bytes - 1) As Byte
  70.         ' limite valori
  71.         x1 = Math.Truncate(x1 / 2)
  72.         x2 = Math.Truncate(x2 / 2)
  73.         If x1 >= immagine.Width Then x1 = immagine.Width - 1
  74.         If x2 >= immagine.Width Then x2 = immagine.Width - 1
  75.         If y1 >= immagine.Height Then y1 = immagine.Height - 1
  76.         If y2 >= immagine.Height Then y2 = immagine.Height - 1
  77.         ' a 4bpp scrivo 2 pixel adiacenti alla volta
  78.         colore = colore + colore * 16                                               ' valore per due pixel uguali
  79.         For colonna As UInt32 = x1 To x2
  80.             For riga As UInt32 = y1 To y2
  81.                 Dim ind As UInt32 = colonna + riga * immagine.Width                 'calcolo l'indice
  82.                 colorValues(ind) = colore
  83.             Next
  84.         Next
  85.         System.Runtime.InteropServices.Marshal.Copy(colorValues, 0, ptr, bytes)
  86.         immagine.UnlockBits(bmpData)                                                'sblocco bit
  87.         immagine.Save("C:\" & name & ".bmp", Imaging.ImageFormat.Bmp)
  88.         immagine.Save("C:\" & name & ".tiff", Imaging.ImageFormat.Tiff)
  89.         immagine.Dispose()
  90.     End Sub



Provo a spiegare cosa stavo tentando di fare
Devo creare 4 grafiche ,in pratica un rettangolo bianco con al suo interno in una data posizione un rettangolo nero( poi dovrò associare al nero un determinato valore essendo un 4bpp ma utilizzato solo 3 bpp)ogni grafica ha alcuni parametri uguali alle altre e altri diversi .Avevo pensato di creare una Sub che si incarica di fare tutto , io le passo ogni volta i dati e poi la chiamo 4 volte. Dopo ogni chiamata salvo la grafica con un determinato nome .
Tutte le volte mi da errore "System.IndexOutOfRangeException: 'Indice oltre i limiti della matrice.'"
nella riga "colorValues(ind) = colore"
Carlo mi ha sempre detto che se voglio una grafica da 1000 pixel devo scrivere 999 perchè viene contato anche lo 0 , infatti quando dichiaro le dimensioni  sottraggo 1 .
Però mi da errore .....Sicuramente mi sono dormito qualcosa .
Grazie

Ultima modifica effettuata da bernie il 08/08/2021 alle 17:31
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1316
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 12:00
Lunedì, 09/08/2021
La prime cose da sapere per verificare quanto hai scritto, sono i valori in mm a noi sconosciuti.

Quando sarà risolto l'errore "System.IndexOutOfRangeException: 'Indice oltre i limiti della matrice.'", ad ogni case generi due rettangoli, ma i rettangoli non finiranno nella stessa immagine, il rettangolo bianco viene creato in una bitmap e salvato, poi il rettangolo nero viene creato in un'altra bitmap e sovrascrive il file dove c'era il rettangolo bianco.

Stessa cosa se analizzi il for, non cambiando mai il nome i files vengono sovrascritti e alla fine ne troverai solo due...

Se mi metti in condizione di provarlo con i valori che hai usato tu...

Ultima modifica effettuata da Carlo il 09/08/2021 alle 12:32


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


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 13:17
Lunedì, 09/08/2021
Hai ragione, larghezzamm 1000, altezzamm 2000, framemm65,gapmm5, mmpixel 14,17
Perché dici che non cambio nome? Ogni case ha un valore diverso di nome che passo alla sub.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1316
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:27
Lunedì, 09/08/2021
Testo quotato

Postato originariamente da bernie:


Perché dici che non cambio nome? Ogni case ha un valore diverso di nome che passo alla sub.  



Ho guardato meglio, è scritto in grigetto, si il nome lo cambi, resta l'errore che all'interno di un case richiami due volte la routine rettangolo che salva due volte con lo stesso nome i due rettangoli creati su due bitmap diverse, di fatto troverai salvato solo il secondo rettangolo.

Entro domani faccio una verifica su VS, solo leggendo non posso dire di più.


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


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 17:49
Lunedì, 09/08/2021
Non capisco, nel tuo esempio chiamavi 3 volte la funzione rettangolo e crearvi una grafica con 3 rettangoli, uno bianco, uno grigio e uno nero.
La differenza che vedo è che mentre nel tuo esempio salvavi il bmp dopo le tre chiamate alla funzione, io salvo il bmp nella funzione. Ed è logico, volevo evitare di  scrivere il salvataggio 4 volte. Al limite potrei creare una funzione per salvare.
Era solo per rendere il programma più leggibile. Ho sbagliato?
Grazie

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