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?
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
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