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 - Visualizzatore immagini
Forum - C# / VB.NET - Visualizzatore immagini

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 22:27
Venerdì, 14/02/2020
E' parecchio che consulto questo sito, ed ora ho deciso di iscrivermi per poter avere suggerimenti su problemi
più specifici. Inizio subito con il problema che ho attualmente.

Dovendo organizzare e archiviare le mie fotografie ( + di un migliaio ) e non avendo trovato programmi
già confezionati con le caratteristiche di cui avrei bisogno ( automatismi di catalogazione personalizzata ),
fiducioso della piccola esperienza acquisita con altri progetti in VB, ho deciso di provare con il " faccio da me ".

Il programma dovrebbe popolare un Panel con le miniature delle immagini ( tutte o in parte ) contenute in una
cartella, come " FastStone Image Viewer o XnView ".
Ho utilizzato il metodo OpenFileDialog, ma non riesco a progredire a causa di alcuni problemi.
Ecco il codice a cui sono giunto:

Codice sorgente - presumibilmente VB.NET

  1. Dim Path as string = "G:\Ilmiofotoalbum""
  2.        Dim ofd1 As OpenFileDialog = New OpenFileDialog()
  3.        ofd1.InitialDirectory = Path
  4.        ofd1.Multiselect = True
  5.        ofd1.Filter = "All files|*.*"
  6.        If ofd1.ShowDialog() = DialogResult.OK Then
  7.            Dim files() As String = ofd1.FileNames
  8.            Dim x As Integer = 20
  9.            Dim y As Integer = 20
  10.            Dim W As Integer = 180
  11.            Dim H As Integer = 120
  12.            Dim pic As New PictureBox
  13.            For Each FileName In files
  14.                pic.Image = Image.FromFile(FileName)
  15.                pic.Size = New System.Drawing.Size(W, H)
  16.                pic.Location = New Point(x, y)
  17.                pic.SizeMode = PictureBoxSizeMode.StretchImage
  18.                x = x + W + 20
  19.                If x >= 600 Then
  20.                    x = 20
  21.                    y += H + 20
  22.                End If
  23.                Panel1.Controls.Add(pic)
  24.                MsgBox("ok")
  25.            Next
  26.  
  27. Panel1 = Size 920;680



La ricerca e la selezione dei file funzionano, le immagini vengono visualizzate nella posizione corretta ma
una sola per volta, quando viene visualizzata un'immagine scompaiono le precedenti.
Avrei anche bisogno di visualizzare il nome del file relativo e poter selezionare le immagini per effettuare
la catalogazione.

Ringrazio anticipatamente e saluto.

Gianni

Ultima modifica effettuata da Thejuster il 16/02/2020 alle 16:01
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 22:59
Venerdì, 14/02/2020
Devi generare una matrice di picture box, o una lista

Codice sorgente - presumibilmente VB.NET

  1. Panel1.Size = New Size(920, 680)
  2.         Dim Path As String = "G:\Ilmiofotoalbum"""
  3.         Dim ofd1 As OpenFileDialog = New OpenFileDialog()
  4.         ofd1.InitialDirectory = Path
  5.         ofd1.Multiselect = True
  6.         ofd1.Filter = "All files|*.*"
  7.         If ofd1.ShowDialog() = DialogResult.OK Then
  8.             Dim files() As String = ofd1.FileNames
  9.             Dim x As Integer = 20
  10.             Dim y As Integer = 20
  11.             Dim W As Integer = 180
  12.             Dim H As Integer = 120
  13.             Dim Npic As UInt16 = 0 ' serve un indice per identificare le pic
  14.             Dim pic(files.GetUpperBound(0)) As PictureBox ' ho messo il numero delle immagini cliccate
  15.             For Each FileName In files
  16.                 Npic += Npic ' incremento l'indice della pic
  17.                 pic(Npic) = New PictureBox ' creo una nuova picturebox
  18.                 pic(Npic).Image = Image.FromFile(FileName)
  19.                 pic(Npic).Size = New System.Drawing.Size(W, H)
  20.                 pic(Npic).Location = New Point(x, y)
  21.                 pic(Npic).SizeMode = PictureBoxSizeMode.StretchImage
  22.                 x = x + W + 20
  23.                 If x >= 600 Then
  24.                     x = 20
  25.                     y += H + 20
  26.                 End If
  27.                 Panel1.Controls.Add(pic(Npic)) ' tutte le pic sono gestite come una matrice
  28.                 ' MsgBox("ok")
  29.             Next
  30.         End If



Devi lavorare sulla gestione dei files nella cartella.
1) devi caricare la lista dei file
2) devi contare quante immagini ci sono
3) devi dimensionare la matrice delle picturebox

Incontrerai anche altri problemi, se carichi molte immagini senza rimensionarle la memoria finirà presto.

Con questo approcio ti sarà difficile mettere i nomi e le caratteristiche delle foto.
Un approcio efficiente è quello di aggiungere un UserControl o ControlloUtente, con il Controllo utente puoi creare l'equivalente di un form dove posizioni una picturebox e una label, più altre cose se ti servono, poi nel tuo form1 che già hai creato con il panel1 aggiungi tutti gli UserControl che vuoi, con la stessa modalità fatta con le picturebox(xx), gli UserControl(xx) hanno lindice per cui nessun problema per identificarli posizionarli e modificarli.

Ultima modifica effettuata da Carlo il 15/02/2020 alle 0:04


in programmazione tutto è permesso
PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 23:20
Venerdì, 14/02/2020

Grazie mille Carlo per la tua risposta lampo molto dettagliata, sono ammirato.
Domani leggo attentamente e provo, poi ti faccio sapere.
Buon fine settimana.

P.S.
Chiedo scusa se commetto qualche errore, non sono molto abituato a scrivere.
Mi sono accorto che nel titolo non ho specificato [VB.net], e devo pure imparare ad usare i tag.

Gianni

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 23:01
Domenica, 16/02/2020
Utilizza un FlowLayoutPanel con disposizione Da sinistra verso destra.
I Controlli saranno automaticamente messi uno accanto all'altro e spostati in basso quando serve
con le scrollbar in modo da scorrere.

Come seconda cosa, ti conviene come detto da carlo di ridurre l'immagine.
Una volta aperto in file di disegnare l'immagine di una dimensione tipo 250,250 max

Carichi prima l'immagine in una Bitmap vuota e poi con il graphics la ridisegni 250 x 250 giusto per avere un anteprima.

per risparmiare carico di memoria il controllo picturebox ha una proprietà chiamata Tag da li esempio puoi impostare il percorso originale del file.

un esempio pratico è
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Load()
  2.     Dim files As String() = Directory.GetFiles(CARTELLA_DELLE_IMMAGINI)
  3.  
  4.     For Each s As String In files
  5.  
  6.         If s.Contains(".png") OrElse s.Contains(".jpg") OrElse s.Contains(".bmp") Then
  7.             Dim p As Panel = New Panel()
  8.             p.BackgroundImageLayout = ImageLayout.Stretch
  9.             p.Size = New Size(100, 100)
  10.             Dim b As Bitmap = New Bitmap(100, 100)
  11.             Dim img As Image = Image.FromFile(s)
  12.             Dim g As Graphics = Graphics.FromImage(b)
  13.             g.DrawImage(img, New Rectangle(0, 0, 100, 100))
  14.             p.Cursor = Cursors.Hand
  15.             p.BackgroundImage = b
  16.             p.Tag = s
  17.             p.Click += P_Click
  18.             flowLayoutPanel1.Controls.Add(p)
  19.         Else
  20.             Continue For
  21.         End If
  22.     Next
  23. End Sub



ovviamente poi al click

Codice sorgente - presumibilmente VB.NET

  1. 'Mostra un dialogo che mostra l'immagine
  2.  
  3. Private Sub P_Click(ByVal sender As Object, ByVal e As EventArgs)
  4.     Dim img As Image = Image.FromFile((CType(sender, Panel)).Tag.ToString())
  5.     Dim f As Form = New Form()
  6.     f.BackgroundImage = img
  7.     f.ShowDialog()
  8. End Sub



E' solo un esempio ma funzionale.
poi dopo ti sistemi meglio tutto a tuo piacimento


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:44
Lunedì, 17/02/2020
Gli esempi di Thejuster sono sempre utili, e come ha affermato è una partenza, ho fatto delle aggiunte:

1) importante liberare la memoria, con img.Dispose()
2) per aggiungere il click ho messo l'istruzione estesa, in VisualStudio2012/2017 p.click, non è riconosciuto, forse ci vuole un Imports ?
3) aggiunto OpenFileDialog con il filtro per le sole immagini
4) variabili H e W per scegliere la dimensione della miniatura
5) l'aspect ratio della miniatura viene calcolato in accordo con l'immagine trattata
6) la finestra di dialogo mostra l'immagine ridimensionabile e alcune info

Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO
  2.  
  3. Public Class Form1
  4.  
  5.     Private Sub ButLOAD_Click(sender As Object, e As EventArgs) Handles ButLOAD.Click
  6.         Dim OpDi As OpenFileDialog = New OpenFileDialog()
  7.         OpDi.Multiselect = True
  8.         ' solo immagini riconosciute
  9.         OpDi.Filter = "Images(*.jpg *.bmp *.png *.gif *.tif)|*.jpg;*.bmp;*.png;*.gif;*.tif|Tutti i file (*.*)|*.*"
  10.         If OpDi.ShowDialog() = DialogResult.OK Then
  11.             Dim files() As String = OpDi.FileNames
  12.             ' dimensioni a piacere miniatura, quadrata per mantenere proporzioni
  13.             Dim W As Integer = 100
  14.             Dim H As Integer = 100
  15.             'sulla barra del titolo, il percorso
  16.             Me.Text = Path.GetDirectoryName(OpDi.FileName)
  17.             For Each FileName In files
  18.                 Dim p As Panel = New Panel()
  19.                 p.BackgroundImageLayout = ImageLayout.None
  20.                 p.Size = New Size(W, H)
  21.                 Dim b As Bitmap = New Bitmap(W, H)
  22.                 Dim img As Image = Image.FromFile(FileName)
  23.                 Dim g As Graphics = Graphics.FromImage(b)
  24.                 ' ridimensionamento con rispetto proporzioni
  25.                 Dim proporzioni As Single = img.Width / img.Height
  26.                 If img.Width > img.Height Then
  27.                     ' orizzontale
  28.                     g.DrawImage(img, New Rectangle(0, H / 2 - H / proporzioni / 2, W, H / proporzioni))
  29.                 Else
  30.                     ' verticale
  31.                     g.DrawImage(img, New Rectangle(W / 2 - W * proporzioni / 2, 0, W * proporzioni, H))
  32.                 End If
  33.                 p.Cursor = Cursors.Hand
  34.                 p.BackgroundImage = b
  35.                 p.BackColor = Color.Silver
  36.                 p.BorderStyle = BorderStyle.FixedSingle
  37.                 p.Tag = FileName
  38.                 ' aggiunge il click
  39.                 AddHandler p.Click, AddressOf P_Click
  40.                 FlowLayoutPanel1.Controls.Add(p)
  41.                 ' libero la memoria
  42.                 img.Dispose()
  43.             Next
  44.         End If
  45.     End Sub
  46.  
  47.     'Mostra un dialogo che mostra l'immagine
  48.  
  49.     Private Sub P_Click(ByVal sender As Object, ByVal e As EventArgs)
  50.         Dim img As Image = Image.FromFile((CType(sender, Panel)).Tag.ToString())
  51.         Dim f As Form = New Form()
  52.         f.Text = Path.GetFileName((CType(sender, Panel)).Tag.ToString()) & " - " & img.Size.ToString()
  53.         f.BackgroundImage = img
  54.         ' finestra ridimensionabile
  55.         f.BackgroundImageLayout = ImageLayout.Zoom
  56.         f.Show()
  57.     End Sub
  58.  
  59.     Private Sub ButSVUOTA_Click(sender As Object, e As EventArgs) Handles ButSVUOTA.Click
  60.         FlowLayoutPanel1.Controls.Clear()
  61.     End Sub
  62.  
  63.     Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged
  64.         FlowLayoutPanel1.Size = New Size(Me.Width - 40, Me.Height - 90)
  65.     End Sub
  66.  
  67. End Class



E' ancora una partenza, i Buttons ButLOAD, ButSVUOTA e il FlowLayoutPanel FlowLayoutPanel1, vanno aggiunti in progettazione.

Ultima modifica effettuata da Carlo il 18/02/2020 alle 13:11


in programmazione tutto è permesso
PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 22:18
Martedì, 18/02/2020
Salve a tutti e grazie delle risposte.
Scusate il ritardo ma ho avuto contrattempi che non ho potuto procrastinare.
Datemi il tempo di leggere le vostre mail poi risponderò.
Scusate ancora.

Gianni

PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 22:16
Mercoledì, 19/02/2020
In questi giorni durante le mie vicissitudini ho potuto lavorare un poco, ma su un pc non collegato in rete,
e non avendo letto le vostre mail ho proseguito seguendo la mia strada.

Ora ho letto, ma ho dovuto constatare che, conoscendo solo genericamente il mio progetto voi avete giustamente
proposto le vostre idee e di questo ringrazio immensamente.
Ma mi sono chiesto se sia giusto farvi perdere del  tempo prezioso per cercare di risolvere i miei problemi proponendo
soluzioni che potrebbero anche non essere utili ai miei scopi.
Premettendo che sono sempre curioso di vedere come altri vedono e risolvono lo stesso problema, ho pensato
di preparare un pezzo di codice per darvi modo di vedere ( se lo volete ) come ho impostato la mia Form principale.
Questo codice sarebbe da mettere nella Sub Form Load e dimensiona un Form vuoto:

Codice sorgente - presumibilmente VB.NET

  1. Me.Width = 1549   '---------------- Larghezza  Form 1 ------------------
  2.         Me.Height = 876   '----------------- Altezza  Form 1 ------------------
  3.         Me.Left = (Screen.PrimaryScreen.Bounds.Width - Me.Width) / 2    '---------------- Centratura x Form 1 ---
  4.         Me.Top = (Screen.PrimaryScreen.Bounds.Height - Me.Height) / 2   Form 1 ------ Centratura y Form 1 ---
  5.         Dim Txtbx As New TextBox   '------------ Text Box --------------
  6.         Txtbx.Multiline = True
  7.         Txtbx.Size = New Size(624, 30)
  8.         Txtbx.Location = New Point(12, 443)
  9.         Txtbx.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  10.         Controls.Add(Txtbx)
  11.         Dim PictureBox0 As New PictureBox   '--------- finestra PictureBox ---------
  12.         PictureBox0.Size = New Size(624, 416)
  13.         PictureBox0.Location = New Point(12, 12)
  14.         PictureBox0.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  15.         Controls.Add(PictureBox0)
  16.         Dim Panel1 As New Panel   '--------- finestra Panel ---------
  17.         Panel1.Size = New Size(879, 765)
  18.         Panel1.Location = New Point(642, 12)
  19.         Panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  20.         Controls.Add(Panel1)
  21.         Dim Button1 As New Button '--------- Button 1 - Chiudi ---------
  22.         Button1.Size = New Size(100, 30)
  23.         Button1.Location = New Point(1421, 791)
  24.         Button1.Text = "Chiudi"
  25.         Button1.BackColor = Color.FromArgb(200, 110, 200)
  26.         Button1.Font = New Font("Microsoft Sans Serif", 12)
  27.         Button1.ForeColor = Color.Navy
  28.         Button1.TextAlign = ContentAlignment.MiddleCenter
  29.         Controls.Add(Button1)
  30.         Dim Label2 As New Label   '---------------- Label 2 - comando Selezione cartella --------------
  31.         Label2.Size = New Size(130, 30)
  32.         Label2.Location = New Point(33, 791)
  33.         Label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  34.         Label2.Text = "Selezione cartella"
  35.         Label2.BackColor = Color.PaleGreen
  36.         Label2.Font = New Font("Microsoft Sans Serif", 10)
  37.         Label2.ForeColor = Color.Black
  38.         Label2.TextAlign = ContentAlignment.MiddleCenter
  39.         Controls.Add(Label2)
  40.         Dim Label3 As New Label   '---------------- Label 3 - comando Numerazione --------------
  41.         Label3.Size = New Size(130, 30)
  42.         Label3.Location = New Point(178, 791)
  43.         Label3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  44.         Label3.Text = "Numerazione"
  45.         Label3.BackColor = Color.PaleGoldenrod
  46.         Label3.Font = New Font("Microsoft Sans Serif", 10)
  47.         Label3.ForeColor = Color.Black
  48.         Label3.TextAlign = ContentAlignment.MiddleCenter
  49.         Controls.Add(Label3)
  50.         Dim Label4 As New Label   '---------------- Label 4 - comando Caalogazione --------------
  51.         Label4.Size = New Size(130, 30)
  52.         Label4.Location = New Point(319, 791)
  53.         Label4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  54.         Label4.Text = "Catalogazione"
  55.         Label4.BackColor = Color.Khaki
  56.         Label4.Font = New Font("Microsoft Sans Serif", 10)
  57.         Label4.ForeColor = Color.Black
  58.         Label4.TextAlign = ContentAlignment.MiddleCenter
  59.         Controls.Add(Label4)
  60.         Dim Label5 As New Label   '---------------- Label 5 - comando Cancella tutto --------------
  61.         Label5.Size = New Size(130, 30)
  62.         Label5.Location = New Point(642, 791)
  63.         Label5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  64.         Label5.Text = "Cancella tutto"
  65.         Label5.BackColor = Color.LightCoral
  66.         Label5.Font = New Font("Microsoft Sans Serif", 10)
  67.         Label5.ForeColor = Color.Black
  68.         Label5.TextAlign = ContentAlignment.MiddleCenter
  69.         Controls.Add(Label5)
  70.         Dim Label6 As New Label   '---------------- Label 6 - comando Cancella selezione --------------
  71.         Label6.Size = New Size(130, 30)
  72.         Label6.Location = New Point(789, 791)
  73.         Label6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  74.         Label6.Text = "Cancella selezione"
  75.         Label6.BackColor = Color.RosyBrown
  76.         Label6.Font = New Font("Microsoft Sans Serif", 10)
  77.         Label6.ForeColor = Color.Black
  78.         Label6.TextAlign = ContentAlignment.MiddleCenter
  79.         Controls.Add(Label6)
  80.         Dim Label7 As New Label   '---------------- Label 7 - comando Ordinamento --------------
  81.         Label7.Size = New Size(130, 30)
  82.         Label7.Location = New Point(939, 791)
  83.         Label7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
  84.         Label7.Text = "Ordinamento"
  85.         Label7.BackColor = Color.SkyBlue
  86.         Label7.Font = New Font("Microsoft Sans Serif", 10)
  87.         Label7.ForeColor = Color.Black
  88.         Label7.TextAlign = ContentAlignment.MiddleCenter
  89.         Controls.Add(Label7)


Detto questo proseguo con i codici, le spiegazioni e i commenti su questo thread.
Cercherò di essere più chiaro possibile, ma ho  paura che il post sarà piuttosto lungo e vi prego di farmi sapere
se questa cosa non va bene ed eventualmente come mi devo comportare.

Siccome non ho ancora deciso se utilizzare layout fissi ( probabile ) o ridimensionabili da mouse,
per facilitare i calcoli ho assegnato a delle  variabili pubbliche tutti i valori di settaggio.

Codice sorgente - presumibilmente VB.NET

  1. Public Wpanel As Integer = 800   '... Larghezza Panel per cambio riga
  2.     Public xpicin As Integer = 20   '... posizione x inizio righe picturebox
  3.     Public xpic As Integer = 20   '... posizione x picturebox
  4.     Public ypic As Integer = 20   '... posizione y picturebox
  5.     Public Wpic As Integer = 120   '... larghezza picturebox
  6.     Public Hpic As Integer = 80   '... altezza picturebox
  7.     Public ximg As Integer = 5   '... posizione x immagine all'interno di picturebox
  8.     Public yimg As Integer = 5   '... posizione y immagine all'interno di picturebox
  9.     Public Wfdim As String = 0.0503   '... fattore dimensionamento larghezza immagine all'interno di picturebox
  10.     Public Hfdim As String = 0.0445  '... fattore dimensionamento altezza immagine all'interno di picturebox
  11.     Public hlab As Integer = 15   '... altezza label
  12.     Public ftxt As String = "Microsoft Sans Serif"   '--- Font della label
  13.     Public htxt As Integer = 7   '... altezza Font della label
  14.     Public spWimg As Integer = 20   '... spazio orizzontale tra immagini ( e cornici )
  15.     Public spHimg As Integer = 30   '... spazio verticale tra immagini ( e cornici )



Qui Inizia il codice di attuazione:

Codice sorgente - presumibilmente VB.NET

  1. 'Dim Path As String = "G:\Ilmiofotoalbum" '------------------------------ percorso cartelle immagini
  2.         Dim ofd1 As OpenFileDialog = New OpenFileDialog()
  3.         ofd1.InitialDirectory = Path
  4.         ofd1.Multiselect = True
  5.         ofd1.Filter = "All files|*.*"
  6.         ofd1.FilterIndex = 2
  7.         ofd1.RestoreDirectory = True
  8.         If ofd1.ShowDialog() = DialogResult.OK Then
  9.             If Not Panel1.Controls.Count = 0 Then '------------------- controllo se nel panel ci sono già miniature
  10.                 Dim iRisp As Integer
  11.                 iRisp = MsgBox(" Nel Pannello sono già presenti altre immagini," & vbCrLf & vbCrLf & _
  12.                                " [ SI ] Aggiunge le nuove immagini" & vbCrLf & vbCrLf & _
  13.                                " [ NO ] Cancella le immagini presenti.", 3 + 32)
  14.                 Select Case iRisp
  15.                     Case vbYes
  16.                     Case vbNo
  17.                         Panel1.Controls.Clear()
  18.                         Call sb320()   '----------------------------- Routine per cancellare il contenuto del Panel
  19.                     Case Else
  20.                         Exit Sub
  21.                 End Select
  22.             End If



Siccome non ho capito esattamente a cosa serve sapere il numero dei file della cartella, ho pensato che
avrebbe potuto essere utile anche il numero delle sole immagini selezionate , per questo ho implementato
tutte e due le funzioni di conteggio da usare secondo l'esigenza.

Codice sorgente - presumibilmente VB.NET

  1. Dim files() As String = ofd1.FileNames
  2.             Dim din As New IO.DirectoryInfo(Path) '---------------------------------------- conteggio file e item
  3.             Dim nimg As Integer = CInt(din.GetFiles.GetLength(0)) '------------------ numero file in folder
  4.             Dim nitm As Integer = UBound(files) '-------------------------------------------- numero item in array
  5.             Label5.Text = (nitm + 1 & " -  immagini")
  6.             Dim Npbx As UInt16 = 0 '... indice per identificare le pic
  7.             'Dim Nlab As UInt16 = 0 '... indice per identificare le label
  8.             Dim pic(nimg) As PictureBox '----------------------------------- numero file in folder / numero item in array



Qui ho pensato di realizzare delle miniature con una cornice che cambia colore quando vengono selezionate.
Per fare ciò ho ridimensionato l'immagine da inserire nella PictureBox:

Codice sorgente - presumibilmente VB.NET

  1. For Each FileName In files
  2.                 Npbx += Npbx '-------------------------------------- incremento l'indice della pic
  3.                 ''Nlab = Npic
  4.                 pic(Npbx) = New PictureBox '------------------ creo una nuova picturebox
  5.                 pic(Npbx).BackColor = Color.Gray '---------- colore della fondo che rimarrà visibile ( cornice )
  6.                 pic(Npbx).Size = New System.Drawing.Size(Wpic, Hpic) '----- Dimensione PictureBox  = ( 120 x 80 )
  7.                 pic(Npbx).Location = New Point(xpic, ypic)
  8.                 pic(Npbx).Image = Image.FromFile(FileName)
  9.                 Dim bm_source As New Bitmap(FileName)   '-------------- ridimensionamento immagine ----------------
  10.                 Dim bm_dest As New Bitmap(CInt(bm_source.Width * Wfdim), CInt(bm_source.Height * Hfdim))
  11.                 '--- In questo caso Size sarà: Wfdim = 0,0503 e Hfdim = 0,0455
  12.                 Dim gr_dest As Graphics = Graphics.FromImage(bm_dest)
  13.                 gr_dest.DrawImage(bm_source, ximg, yimg, bm_dest.Width, bm_dest.Height)
  14.                 '--- In questo caso Location sarà: ximg = 5 e yimg = 5
  15.                 '---------------------------------------------------------- Dimensioni dell'immagine risultante = ( 115 x 76 )
  16.                 pic(Npbx).Image = bm_dest '------- caricamento dell'immagine in PictureBox



A questo punto o implementato le label con il titolo dell'immagine:

Codice sorgente - presumibilmente VB.NET

  1. Dim labtit As New Label '--------------------------------------------- realizzazione label titolo dell'immagine
  2.                 labtit.BackColor = Color.Beige
  3.                 Dim filetit As System.IO.FileInfo
  4.                 filetit = My.Computer.FileSystem.GetFileInfo(FileName) '--------- ricavo il titolo dell'immagine
  5.                 labtit.Text = (filetit.Name)
  6.                 labtit.Font = New Font(ftxt, htxt)
  7.                 labtit.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
  8.                 labtit.Size = New System.Drawing.Size(Wpic, hlab)
  9.                 labtit.Location() = New Point(xpic, ypic + Hpic)
  10.  
  11.                 xpic = xpic + Wpic + spWimg '-------------------------- aggiornamento coordinate immagine e label successive
  12.                 If xpic >= Wpanel Then '----------- larghezza pannello = 880  alla sesta PictureBox passa alla riga successiva
  13.                     xpic = xpicin
  14.                     ypic += Hpic + spHimg
  15.                 End If
  16.                 Panel1.Controls.Add(pic(Npbx))
  17.                 Panel1.Controls.Add(labtit)
  18.                 gr_dest.Dispose()
  19.             Next
  20.         End If
  21.         MsgBox(Panel1.Controls.Count)



Devo anche ammettere che purtroppo la mia esperienza in VB e la stanchezza di quei quattro neuroni rimasti
( 72 anni ), mi prendono un mucchio di tempo in più di quello che impieghereste voi.
Ma tengo duro perché è la mia passione, viva i bit.

Ho cercato di provare l'esempio di Thejuster perché sarei curioso di vedere il risultato utilizzando FlowLayoutPanel,
ma non sono riuscito a farlo funzionare perché mi da errore sulla riga p.Click += P_Click

'Public Event Click(sender As Object, e As System.EventArgs)' is an event, and cannot be called directly.
Use a 'RaiseEvent' statement to raise an event.

Per quanto riguarda la memoria avrete visto che ho utilizzato il metodo Graphic per ridimensionare le immagini,
( 120 x 8  per la PictureBox  e 115 x 76  per l'immagine  ;) anche se ammetto che non pensavo alla memoria ma alla cornice.
Il messaggio di memoria insufficiente è comparso dopo caricato un centinaio di immagini 750 Kb media x 100 = 75 Mb,
ma non so ancora come interpretarlo.
Ho inserito gr_dest.Dispose(), sostituto di img.Dispose(), ma non ho notato differenze.
Altro errore che non ho ancora individuato è che alla fine, quando vado a contare le immagini del pannello,
risultano sempre essere il doppio di quelle effettivamente presenti.

Sto ancora guardando cose del codice di Carlo, ma credo sia ora di chiudere perché le cosa sono andate
per le lunghe.
Torno a ringraziarvi della pazienza, aspetto commenti e Saluto.

Gianni

PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 12:31
Giovedì, 20/02/2020

Buon giorno, rieccomi.

Sono riuscito a provare il codice di Carlo, ed ho potuto constatare i vantaggi del metodo FlowLayoutPanel.
Veloce a caricare e non da problemi di memoria, ho caricato più di 800 immagini poi mi sono fermato.
Non ho però capito a cosa serve e come funziona la parte del codice "AddHandler p.Click, AddressOf P_Click",
come non ho capito come gestisce la parte dell'etichetta.
Dovrò poi anche implementare i codici per la selezione delle miniature, ma di questo ne riparliamo
la prossima volta.
Ora proverò a modificare il mio codice con il metodo che mi avete suggerito, poi faccio sapere.

Rinnovo i ringraziamenti e saluto.

Gianni

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:49
Giovedì, 20/02/2020
Purtroppo sono abituato a scrivere in C Like e i convertitori online alcune cose non le traducono.

AddHandler al p_Click aggiunge un evento ad un controllo. appunto al momento del click.
Ma, se crei un ciclo per esempio 100 controlli e li reindirizzi tutti allo stesso void del click
allora tutti e 100 controlli risponderanno a quel click.

ed entra in gioco il CType per identificare Quale controllo sta chiamando quel metodo.
e da lì risalire al tag e mostrare l'immagine.

Alla fine cmq lavorandoci un pò puoi ottenere qualcosa genere.
fatto in 5 minuti.



Thejuster ha allegato un file: Immagine.PNG (139644 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Thejuster il 20/02/2020 alle 14:14


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo