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 - Pagina 2

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


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 19:27
Giovedì, 20/02/2020
Testo quotato

Postato originariamente da gianni47:
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.


Quello che ti viene proposto è frutto di un pensiero, non è detto che poi lo devi usare, il numero sarebbe servito se a priori vuoi impostare un ambiente per maneggiare un numero noto di immagini e nella cartella ci sono mescolati files diversi da immagini. Ma se hai provato il mio esempio hai visto che neanche io l'ho usato, invece ho preferito mettere un filtro nella open in modo da avere solo immagini grafiche riconosciute da VB .NET:
Codice sorgente - presumibilmente C# / VB.NET

  1. OfD1.Filter = "Images(*.jpg *.bmp *.png *.gif *.tif)|*.jpg;*.bmp;*.png;*.gif;*.tif|Tutti i file (*.*)|*.*"



Testo quotato

Postato originariamente da gianni47: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


Come già ti ha comunicato Thejuster la riga è uscita da un convertitore e non è corretta la devi sostituire con:
Codice sorgente - presumibilmente C# / VB.NET

  1. AddHandler p.Click, AddressOf P_Click


e l'esempio di Thejuster funzionerà.

Quello che affermo ora scaturisce dalla sola lettura del codice, non ho fatto prove.
Hai postato questo:
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



alla riga 8 carichi un file :                      pic(Npbx).Image = Image.FromFile(FileName)
poi alla riga 16 ancora da una BMP:       pic(Npbx).Image = bm_dest

Ritengo che la riga 8 va eliminata, forse è lei che ti da il raddoppio di immagini conteggiate.
Invece per liberare la memoria devi aggiungere dopo la riga 16 :
                                                         bm_source.Dispose()

Ti avevo anche consigliato di usare un User Control (Controllo Utente se hai VS in italiano), il vantaggio dell'user control e che non ti devi preoccupare di posizionare label e picturebox, non ti devi preoccupare neanche del clik con un indice perché il codice dell'evento click lo scrivi dentro all'user control. Avevo già un programma di esempio Visualizzatore, ora l'ho modificato con alcune idee di Thejuster, l'UserControl si chiama UC1, controlla come funziona.

Allegato zip

Se anche tu alleghi il tuo zip ci do un'occhiata.


Carlo ha allegato un file: VisualizzaIMMAGINI_1.zip (90773 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 21/02/2020 alle 17:34


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


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 21:15
Domenica, 23/02/2020

n questi giorni ho pulito diversi chili di fagioli, patate e cipolle per la fagiolata benefica del mio paese.
Ora Thejuster mi parla di C Like, CType e void del click; che verdure sono che non le conosco?
Questo per dire che di fronte a questi discorsi le mie conoscenze informatiche si fermano miseramente.
Comunque grazie al vostro contributo e alcune rielaborazioni, sono riuscito a stendere un codice che
soddisfa egregiamente le mie aspettative. La modifica sostanziale è stata quella di sostituire il Panel
con il FlowLayoutPanel ( che non conoscevo ancora ). Da qui ho implementato cornice, etichetta e il Click
che mi visualizza l'immagine selezionata ingrandita  in una ImageBox.

Ed ecco il risultato attuale:

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.        ofd1.FilterIndex = 2
  7.        ofd1.RestoreDirectory = True
  8.        If ofd1.ShowDialog() = DialogResult.OK Then
  9.            If Not FlowLayoutPanel1.Controls.Count = 0 Then
  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.                        FlowLayoutPanel1.Controls.Clear()
  18.                    Case Else
  19.                        Exit Sub
  20.                End Select
  21.            End If
  22.            Dim files() As String = ofd1.FileNames
  23.            Dim filetit As System.IO.FileInfo
  24.            For Each FileName In files
  25.                Dim p As Panel = New Panel()
  26.                p.Size = New Size(wpan, hpan)   '.............. (130, 115)
  27.                p.BackColor = Color.Silver
  28.                p.BorderStyle = BorderStyle.FixedSingle
  29.                Dim b As Bitmap = New Bitmap(wpan, hpan)   '.............. (130, 115)
  30.                Dim img As Image = Image.FromFile(FileName)
  31.                Dim gr As Graphics = Graphics.FromImage(b)
  32.                gr.DrawImage(img, ximg, yimg, wimg, himg)   '................(4, 4, 120, 90)
  33.                p.BackgroundImage = b
  34.                p.Tag = FileName
  35.                Dim labtit As New Label '--------------------------------------------- realizzazione label titolo immagine
  36.                labtit.BackColor = Color.Beige
  37.                filetit = My.Computer.FileSystem.GetFileInfo(FileName) '--------- rilevamento titolo immagine
  38.                labtit.Text = (filetit.Name)
  39.                labtit.Font = New Font(ftxt, htxt)   '....................  ("Microsoft Sans Serif", 7)
  40.                labtit.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
  41.                labtit.Size = New System.Drawing.Size(wpan, hlab)   '................ (130, 15)
  42.                labtit.Location() = New Point(xlab, hpan - hlab - 3)   '.................. (0, 115 - 15 - 3)
  43.                FlowLayoutPanel1.Controls.Add(p)
  44.                p.Controls.Add(labtit)
  45.                img.Dispose()
  46.                p.Cursor = Cursors.Hand
  47.                AddHandler p.Click, AddressOf P_Click   '---------------------- selezione immagone per ingrandimento
  48.                AddHandler p.DoubleClick, AddressOf P_2Click   '----------- selezione immagone per catalogazione
  49.  
  50. Private Sub P_Click(ByVal sender As Object, ByVal e As EventArgs)
  51.        Dim img As Image = Image.FromFile((CType(sender, Panel)).Tag.ToString())
  52.        PictureBox1.BackgroundImage = img
  53.        PictureBox1.BackgroundImageLayout = ImageLayout.Stretch
  54.    End Sub
  55.  
  56. Private Sub P_2Click(ByVal sender As Object, ByVal e As EventArgs)
  57.        '------------------ da implementare -------------------
  58.    End Sub



Ora avrei bisogno di implementare la selezione multipla con il mouse.
Se gentilmente mi potete dare qualche indizio ve ne sarei grato.
Saluto e ringrazio dell'attenzione.

Gianni

PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 21:34
Domenica, 23/02/2020
Vi chiedo scusa ma ho risposto senza accorgermi che c'erano altri post nella pagina successiva.
Leggo e poi rispondo.
Scusatemi ancora, sono reduce dalla fagiolata ( preparazione e distribuzione ) e sono ancora un po fuso.

Gianni.

PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 0:27
Martedì, 25/02/2020
Ciao Carlo, ho scaricato e avviato il tuo VisualizzaIMMAGINI.
Cosa dire?. Non so se essere più demoralizzato o ammirato, comunque tutti e due.
Se non fosse che realizzare programmi in VB mi intriga e mi appassiona, andrei a fare altro.

Diminuendo con gli anni le elasticità mentali, da tempo mi sono dato una direttiva nella realizzazione
dei miei programmi:
Utilizzare prevalentemente codici che conosco e su cui posso intervenire anche dopo tanto tempo.
Il metodo che mi sono creato funziona così:

Al posto dei pulsanti solitamente utilizzo le Label, e dal click o doubleclick faccio delle call a sub pubbliche,
che sono la maggioranza dei miei codici come pure le variabili. Questo metodo ha i suoi pro e contro,
ma mi permettere di adattare facilmente il programma modificando, sostituendo o eliminando alcune sub
o la sequenza della loro attuazione.

Credo che qualunque sia l'obiettivo da raggiungere e i metodi utilizzati, la programmazione stimola e
gratifica la creatività dell'artefice e dunque da coltivare senza ripensamenti, e come dici tu :
In programmazione tutto è permesso.

Ho preparato una versione demo del mio programma " almealbumfoto " (così come si pronuncia in dialetto piemontese). Ora come mi hai suggerito tenterò di allegarlo, poi con calma andrò ad analizzare più dettagliatamente il tuo progetto, dopodiché magari provo a giocare un poco per vedere se è possibile
fondere il tuo codice con il mio metodo come ho fatto in questa release.

Purtroppo nell'ambito delle mie conoscenze non ho nessuno con cui parlare e confrontarmi su questi temi,
se non in rete, perciò non finirò mai di ringraziarti per la tua disponibilità.

Gianni


gianni47 ha allegato un file: almealbumfoto_Demo.zip (104911 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 1:35
Martedì, 25/02/2020
Quando si programma per divertimento non sei obbligato a seguire nulla, quello che va bene per te va bene per tutti.
il programma va bene, ti consiglio di modificare il filter e la directory iniziale, se la ometti il programma si riaprerà nell'ultima cartella usata.

Codice sorgente - presumibilmente VB.NET

  1. Public Sub sb310()   '---------------------------------- [ sb310 ] 'lmefotoalbum ---------------------- 200217
  2.         'MsgBox("sb310")
  3.         'Exit Sub
  4.        ' Dim Path As String = "C:\" ' meglio ometterla
  5.         Dim ofd1 As OpenFileDialog = New OpenFileDialog()
  6.        ' ofd1.InitialDirectory = Path ' meglio ometterla
  7.         ofd1.Multiselect = True
  8.         ' ***** FILTRO PER TUTTE LE IMMAGINI ********
  9.         ofd1.Filter = "Images(*.jpg *.bmp *.png *.gif *.tif)|*.jpg;*.bmp;*.png;*.gif;*.tif|Tutti i file (*.*)|*.*"
  10.         ' ****************************************
  11.         ofd1.FilterIndex = 2
  12.         '......
  13.         '......
  14.         '......
  15.         '......



Per l'implementazione successiva: click per selezionare immagini multiple, aspetto che prendi confidenza con l'user control, che semplifica di molto il compito.
Se hai domande, fai pure.


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


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 21:54
Martedì, 25/02/2020
Ciao Carlo, ho riletto i precedenti post per raccogliere le idee e riuscire ad orientarmi sul tema dei contenitori.

Sto cercando di capire quale potrebbe essere il metodo migliore da utilizzare tra le due soluzioni:
Panel  o  flowLayoutPanel ?

Da una prima valutazione mi sembra che i risultati finali dovrebbero essere paragonabili,
escludendo ovviamente i codici esecutivi, ma credo che sicuramente ci siano delle differenze.

Siccome questa scelta è alla base di tutto il progetto, una tua opinione mi sarebbe di grande aiuto.

Per gli user control hai ragione, prima mi alleno e poi ne riparliamo.

Come al solito ringrazio e saluto.

Gianni.

PM Quote
Avatar
gianni47 (Normal User)
Newbie


Messaggi: 16
Iscritto: 14/02/2020

Segnala al moderatore
Postato alle 12:25
Mercoledì, 26/02/2020
Ciao Carlo, per un momento stavo dimenticando quello che ho fatto fino ad ora: cercare in rete.
Non è stato così difficile capire che la scelta ovvia è il flowLayoutPanel.
Non mi sembra il caso di romperti le scatole per queste cose, quindi non disturbarti a rispondermi;
quando sarà ora stai certo che non mancherò di farmi vivo.
Un saluto.

Gianni

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:22
Mercoledì, 26/02/2020
Entrambi i componenti sono IContainer

Ma è anche vero che il FlowLayoutPanel eredità la classe Panel ed una semplice interfaccia IExtenderProvider.

Purtroppo non sò dirti com'è programmata.
Ma allinea automaticamente i controlli contenuti in una direzione che puoi specificare.

Cosa che un comune Panel non può fare.
Una Panel è un comune Contenitore di controlli. Tipo un GroupBox.

Quindi il consiglio è quello di usare il FlowLayoutPanel senza sbatterci troppo la testa, ti ritrovi tutto ordinato,
pratico e veloce.




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