Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 44
  1. #1

    [VB6+SQLServer ] Salvare su tabella un'immagine contenuta in un'imagebox

    Ho la necessità di salvare delle immagini su database (SQLServer). Il campo del db è di tipo Image.
    Dalla mia applicazione l'utente seleziona un file immagine che viene caricato in una ImageBox. Una volta fatta questa operazione il file per me non deve più esistere, infatti vorrei che quando l'utente clicca su SALVA, il programma vada a leggere l'immagine contenuta nell'imagebox, la scomponga e la salvi su db.
    Attualmente per gestire il salvataggio su db utilizzo questo sistema:
    - Memorizzo il Path del file selezionato dall'utente
    - Apro un recordset avente come origine dati la tabella in cui salvare il file
    - Setto una variabile di tipo ADODB.Field col campo Image della tabella
    - Apro il file in modalità Binary Access Read
    - Scompongo il file inserendo ogni pezzetto in un array di tipo Byte
    - Assegno l'array al campo ADODB.Field su citato
    - Eseguo l'Update sul recordset

    Di seguito vi riporto il codice:
    codice:
    ' Carica l'immagine nell'Image box
    Private Sub cmdLoadFoto_Click()
        
        cd.ShowOpen
        strPath = cd.FileName
        ' carica l'immagine
        imgFoto.Picture = LoadPicture(strPath)
        
    End Sub
    
    ' Salva sul db l'immagine contenuta nell'Image box
    Private Sub cmdSaveFoto_Click()
    
        Dim strSQL As String
        Dim adoRS As New ADODB.Recordset
        Dim adoField As ADODB.Field
        Dim bytArray() As Byte
        
        strSQL = "SELECT IDFoto, Foto FROM tbImmagini"
        adoRS.Open strSQL, adoConn, 1, 3
        
        adoRS.AddNew
        
        Set adoField = adoRS.Fields.Item("Foto")
        
        ' Inserisce l'immagine selezionata nel database
        bytArray = fnLeggiFile
        ' Inserisce il file nel nuovo record
        adoField = bytArray()
        
        imgFoto.Picture
    
        adoRS.Update
        
        Set adoRS = Nothing
        
    End Sub
    
    ' Legge l'immagine inserendola nell'array
    Private Function fnLeggiFile() As Byte()
    
        Dim intIndiceFile As Integer, lngDimensioneFile As Long
        ' Array che contine il file scomposto il byte
        Dim bytImmagine() As Byte
        Dim i As Long
        
        ' Cerca il primo indice di file disponibile nel sistema
        intIndiceFile = FreeFile
        ' Apre il file in lettura
        Open strPath For Binary Access Read As intIndiceFile
        
        ' Calcola la dimensione del file
        lngDimensioneFile = LOF(intIndiceFile)
        ' Ridimensiona l'array
        ReDim bytImmagine(lngDimensioneFile)
        ' Cicla il file leggendolo un byte per volta
        For i = 0 To lngDimensioneFile
            Get intIndiceFile, , bytImmagine(i)
        Next
    
        ' Chiude il file
        Close intIndiceFile
        ' Restituisce l'array
        fnLeggiFile = bytImmagine
    
    End Function
    Tutto questo funziona alla perfezione, ma non è esattamente ciò che vuole il mio capo.
    Ovvero, sarebbe preferibile riuscire a scomporre direttamente l'immagine contenuta nell'imagebox e non andare a suddividere il file fisicamente presente su HD, perchè l'utente potrebbe cancellare il file prima di salvarlo.

    Voi avete suggerimenti da darmi?
    Grazie a tutti

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  2. #2
    Utente di HTML.it L'avatar di vonkranz
    Registrato dal
    Sep 2001
    Messaggi
    1,387
    Ammesso e non concesso che tramite qualche oscura API di win sia possibile leggere i singoli bytes che compongono l'immagine caricata nel controllo image, direi che e' una via abbastaza ostica.

    Perche' non fai una copia temporanea del file immagine (chiamandolo pipp.jpg ecc) e poi lavori su questa copia facendo quello che fai adesso con il file "originale"?...se l'utente ti cancella il file prima che tu abbia finito, non hai problemi, tanto tu lavori su pippo.jpg (che poi cancellerai alla fine del lavoro) del quale l'utente ignora completamente l'esistenza...
    ...and I miss you...like the deserts miss the rain...

  3. #3
    vonkranz, era una strada che già avevo proposto e ottimizzato, ma il capo non vuole. ti pare che mi vado a impelagare in cose più complesse, quando potrei fare tutto con una procedura semplice?!
    ma il capo vuole così...

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  4. #4
    Utente di HTML.it L'avatar di vonkranz
    Registrato dal
    Sep 2001
    Messaggi
    1,387
    Originariamente inviato da ladyBlu
    vonkranz, era una strada che già avevo proposto e ottimizzato, ma il capo non vuole. ti pare che mi vado a impelagare in cose più complesse, quando potrei fare tutto con una procedura semplice?!
    ma il capo vuole così...
    ...ma non gli va' bene neanche la soluzione del file temporaneo? :master:
    ...and I miss you...like the deserts miss the rain...

  5. #5
    Originariamente inviato da vonkranz
    ...ma non gli va' bene neanche la soluzione del file temporaneo? :master:
    ripeto... era già fatto così come dici tu, io gli avevo sottoposto questa tua soluzione già realizzata e testata. ma non la vuole...

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  6. #6
    Utente di HTML.it L'avatar di vonkranz
    Registrato dal
    Sep 2001
    Messaggi
    1,387
    Originariamente inviato da ladyBlu
    ripeto... era già fatto così come dici tu, io gli avevo sottoposto questa tua soluzione già realizzata e testata. ma non la vuole...
    ......prova ad impostare adoField come oggettoOLE (nel DB) e fare

    codice:
    adoField = imgFoto.Picture
    oppure
    codice:
    set adoField = imgFoto.Picture
    oppure
    codice:
    adoField = LoadPicture(strPath)
    oppure
    codice:
    set adoField = LoadPicture(strPath)
    ...anche se non credo che funzioni...nessuna delle 4...
    ...and I miss you...like the deserts miss the rain...

  7. #7
    infatti non funziona nè va bene nessuna di quelle che hai detto

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  8. #8
    Utente di HTML.it L'avatar di vonkranz
    Registrato dal
    Sep 2001
    Messaggi
    1,387
    Originariamente inviato da ladyBlu
    infatti non funziona nè va bene nessuna di quelle che hai detto
    ...lo immaginavo.....
    ...sinceramente non so' come puoi uscirne...anche perche' l'immagine memorizzata in RAM non e' detto che corrisponda byte per byte a quello che c'e' nel file...

    ...in estrema ratio puoi provare ad utilizzare il metodo PictureBox.PSet (ovviamente devi caricare l'immagine in un pictuebox e non in un'image ) e vedere se i codici che ti restituisce per ogni singolo pixel dell'immagine corrispondono ai bytes contenuti nel file...ma anche questo penso non sia percorribile, dal momento che i file immagine in genere contengono un'intestazione prima dei dati significativi (l'immagine vera e propria )
    ...and I miss you...like the deserts miss the rain...

  9. #9
    Utente di HTML.it L'avatar di vonkranz
    Registrato dal
    Sep 2001
    Messaggi
    1,387
    ...scusa, e' il metodo PictureBox.Point e NON PictureBox.PSet
    ...and I miss you...like the deserts miss the rain...

  10. #10
    Alla fine ho utilizzato una PictureBox e tramite il metodo PaintPicture ridimensiono l'immagine contenuta.
    Ora mi rimane il problema di leggere l'immagine per salvarla nel db. Ripeto che l'immagine da leggere è quella contenuta nella PictureBox e non il file d'origine sull'hd.

    Qualche idea?

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.