Oppure

Loading
20/06/10 10:48
foralobo
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 20/06/10 12:34
aaa
20/06/10 17:00
Mr SaJaN
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:
    Public Sub Sovrapponi(ByVal NomeFile As String)
        Dim punto As New Point
        Dim x, y As Integer
        Dim ImgWatermark As Bitmap = New Bitmap(WaterMark.Image)
        Dim IMG As Graphics = Graphics.FromImage(ImmagineAperta.Image)

        x = ImmagineAperta.Image.Width - (WaterMark.Image.Width / ImgWatermark.HorizontalResolution * IMG.DpiX)
        y = ImmagineAperta.Image.Height - (WaterMark.Image.Height / ImgWatermark.VerticalResolution * IMG.DpiY)
        punto = New Point(x, y)
        IMG.DrawImageUnscaled(ImgWatermark, punto)
        IMG.Save()
        ImmagineAperta.Image.Save(CartellaImmagini.SelectedPath & "\NUOVA\" & NomeFile, ImageFormat.Jpeg)
        IMG.Dispose()

    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:
aaa
20/06/10 18:59
foralobo
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
aaa
20/06/10 19:02
lorenzo
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.
aaa
20/06/10 20:52
Mr SaJaN
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
aaa
21/06/10 20:04
walker93
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 21/06/10 20:20
aaa