Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [vb.net] Caricamento immagini
Forum - C# / VB.NET - [vb.net] Caricamento immagini

Avatar
foralobo (Normal User)
Pro


Messaggi: 146
Iscritto: 30/11/2009

Segnala al moderatore
Postato alle 12:48
Domenica, 20/06/2010
salve a tutti... ho un problema con le immagini.

uso la classe graphics che trovo molto efficiente per il lavoro che devo fare..ho solo un piccolo problema..Non so poi quanto è piccolo

data una lista di immagini (percorsi di immagini che si trovano in locale)
ho bisogno di disegnarli su una pcturebox...

cmq il problema nn è tanto caricarla ma trovare un modo per caricarli il + velocemente possibile:
uso questo metoto:

dim img as image
img = System.Drawing.Image.FromFile(pathFile)


per carcare una foto va bene ma se devo caricare ad esempio 50 foto mi rallenta molto.

esiste un metodo + efficiente?

grazie


Ultima modifica effettuata da foralobo il 20/06/2010 alle 14:34
PM Quote
Avatar
Mr SaJaN (Normal User)
Rookie


Messaggi: 22
Iscritto: 23/07/2007

Segnala al moderatore
Postato alle 19:00
Domenica, 20/06/2010
in questi giorni ho sviluppato un programma simile, applica un watermark a tutte le foto presenti su una cartella..
però queste immagini devo aprirle, ed è qui che mi ricollego alla tua domanda ^^

se può interessarti e vuoi fare qualche prova, ecco il codice:
Codice sorgente - presumibilmente VB.NET

  1. Public Sub Sovrapponi(ByVal NomeFile As String)
  2.         Dim punto As New Point
  3.         Dim x, y As Integer
  4.         Dim ImgWatermark As Bitmap = New Bitmap(WaterMark.Image)
  5.         Dim IMG As Graphics = Graphics.FromImage(ImmagineAperta.Image)
  6.  
  7.         x = ImmagineAperta.Image.Width - (WaterMark.Image.Width / ImgWatermark.HorizontalResolution * IMG.DpiX)
  8.         y = ImmagineAperta.Image.Height - (WaterMark.Image.Height / ImgWatermark.VerticalResolution * IMG.DpiY)
  9.         punto = New Point(x, y)
  10.         IMG.DrawImageUnscaled(ImgWatermark, punto)
  11.         IMG.Save()
  12.         ImmagineAperta.Image.Save(CartellaImmagini.SelectedPath & "\NUOVA\" & NomeFile, ImageFormat.Jpeg)
  13.         IMG.Dispose()
  14.  
  15.     End Sub


WaterMark e ImmagineAperta sono 2 picturebox, a cui assegno l'immagine prima di richiamare la funzione Sovrapponi()..
tieni conto che per applicare il watermark a 250 immagini (create con paint, un semplice sfondo colorato, dalle dimensioni di circa 25kb a immagine) applicare il logo mi consuma circa 220mb di ram!
non ci mette tanto, una decina di secondi al massimo, ma l'ho testato su vari pc e ad esempio su computer con 512mb di ram riuscirà difficilmente a girare in quanto windows occupa buona parte della ram e il programma crasherebbe andando in ioexception.outofmemory

immagina applicare il logo a foto da svariati mb :-|

quindi non credo ci sia un metodo più semplice per velocizzare tanto il processo di apertura delle immagini (dato che la libreria che permette ciò credo sia una sola, System.Drawing.Image), ma se ci fosse sarei interessato anche io a capire come potrei fare, visto che per il mio programma serve un pc aereo per girare :heehee: :heehee:

PM Quote
Avatar
foralobo (Normal User)
Pro


Messaggi: 146
Iscritto: 30/11/2009

Segnala al moderatore
Postato alle 20:59
Domenica, 20/06/2010
grazie tante ma nn era quello che cercavo..io carico le immagini e le visualizzo tutte...senza sovrapposizione ne nulla..

penso userò un controllo BackgroundWorker...credo possa servire anche a te

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 21:02
Domenica, 20/06/2010
in teoria potresti fare una cosa simile:

1) in un thread inizi ad aprire le immagini, una alla volta salvandole da qualche parte.
2) in contemporanea, nel thread principale, visualizzi le immagini che nel frattempo l'altro thread sta caricando.

Così, almeno, potrai mostrare le immagini senza dover aspettare che siano state tutte caricate. E' una cosa abbastanza delicata comunque, perché è un classico esempio di produttore-consumatore(vedi su google se ti interessa la cosa) e deve essere scritto bene.


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
Mr SaJaN (Normal User)
Rookie


Messaggi: 22
Iscritto: 23/07/2007

Segnala al moderatore
Postato alle 22:52
Domenica, 20/06/2010
non avevo capito che le visualizzavi tutte.. credevo a una a una :D

mi informo bene anche io sulla cosa per vedere se la posso applicare e sopratutto come :D

PM Quote
Avatar
walker93 (Member)
Expert


Messaggi: 460
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 22:04
Lunedì, 21/06/2010
anzichè creare una picture box per ogni immagine (da quanto ho capito è questo quello che fai) perchè non le visualizzi in un controllo listview?
cosi con 1 controllo visualizzi tutte le immagini che vuoi...

edit: con mio codice senza backgroundworker 50 foto in 5 secondi netti, 212 foto in 5 secondi e mezzo

Ultima modifica effettuata da walker93 il 21/06/2010 alle 22:20


Il software è come il sesso, è meglio quando è libero.
Linus Torvalds, Conferenza della Free Software Foundation, 1996 (attribuito)

Non provare mai a spiegare il computer a un profano. È più facile spiegare il sesso a una vergine.
Robert Anson Heinle
PM Quote