Avatar billede henrik_w Nybegynder
02. september 2014 - 14:14 Der er 2 kommentarer

Tage billede der lægges i access

Kan man lave en database, hvor man ved udfyldelse af et felt automatisk får taget et billede via et webcam, som så bliver lagt ned i databasen?
Avatar billede bvirk Guru
08. september 2014 - 14:08 #1
Sikkert, men det kræver viden om hvordan man tager et billede programmæssigt - ved du mere om det?
'ved udfyldelse' kan tilknyttes 'ved indgang' hændelsen - og her skal så kaldes noget der programmæssigt tager et billede og giver en henvisning til en billedfil
Fra Access 2007 og op (så vidt jeg ved) er der en felttype hvor man kan gemme billeder - det kan også foregå i tidligere access versioner hvis man ops på at undgå at gemme OLE objekter - bag det i praksis meningsløse OLE interface gemmer sig en BLOB felttype som kan tilgåes fra vba - BLOB= binært Langt Objekt
Avatar billede bvirk Guru
09. september 2014 - 22:01 #2
Her kommer så lidt - det er blot hints til den intesserede på kode niveau. En Løsning vil afhænge af både af Access og windows version - dette er hentet fra access 2000 forsøg under XP.
API'et er Microsoft Image Acqustion 1.01 Type Libray (reference)

Dette henter et byte array fra usb webcam:

Function jpgImgOFCS() As Byte()
    Dim FileName
    FileName = jpgOfCS()
    If Len(FileName) Then jpgImgOFCS = file2Binary(FileName)
End Function

'Vha. disse kaldes:


I følgende funktion rodes der med filer hvor camaraet gemmer dem - først slettes gamle filer  og tilsidst fiskes der en reference til den nyvalgte - der gåes bag om interfaces! 

Function jpgOfCS()
    Const Wiapath = "C:\Documents and Settings\All Users\Application Data\Microsoft\WIA\"
    Dim pictpath, toKill
    Dim wiaO As WIALib.Wia
   
   
    Set wiaO = New WIALib.Wia
    With wiaO.Devices(0)
        pictpath = Wiapath & .id & "\"
        toKill = Dir(pictpath & "*.*")
        While Len(toKill)
            Kill pictpath & toKill
            toKill = Dir(): Wend
        With .Create()
            .GetItemsFromUI SingleImage, BestPreview: End With
        jpgOfCS = Dir(pictpath & "*.jpg")
        If Len(jpgOfCS) Then jpgOfCS = pictpath & jpgOfCS
    End With
End Function

Function file2Binary(fileN) As Byte()
    With New ADODB.Stream
        .Type = adTypeBinary
        .Open
        .LoadFromFile fileN
        file2Binary = .Read()
    End With
End Function

------------------
En tabel: Camshot (id autonumber,besk text,shot OLE)
id og besk er eneste felter på formular med følgende i klasseobjektet

Private curfile

Private Sub attach_Click()
    Dim arr() As Byte, i, binstr$
    arr = jpgImgOFCS()
    For i = 0 To UBound(arr): binstr = binstr & ChrB(arr(i)): Next
    If Not IsNull(id) Then
        With rsi("Camshot", , , "id=" & id)
            .RS.Edit
            .RS.Fields("shot").AppendChunk binstr
            .RS.Update
        End With
        Form_Current
    Else
        MsgBox "change code to save from getting id"
    End If
   
End Sub

Private Sub Form_Current()
    Dim blobLen, binstr$, arr() As Byte
    If Not IsNull(id) Then
        With rsi("Camshot", , , "id=" & id)
            blobLen = .RS.Fields("shot").FieldSize
            If blobLen Then
                binstr = .RS.Fields("shot").GetChunk(0, blobLen)
                arr = binstr
                binary2File curfile, arr
                pict.Picture = curfile
            Else
                pict.Picture = ""
            End If: End With
    End If
End Sub

Private Sub Form_Open(Cancel As Integer)
    curfile = ParentFolder(CurrentDb.name) & "curImg.jpg"
End Sub

Sub binary2File(FileName, ByteArray)
    With New ADODB.Stream
        .Type = adTypeBinary
        .Open
        .Write ByteArray
        .SaveToFile FileName, adSaveCreateOverWrite
    End With
End Sub

----------------
Man må tænke sig hvordan wrapperen rsi(...) om et ado recordset ser ud - bemærk også refence til ADODB
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester