Avatar billede windll Nybegynder
30. juni 2008 - 16:14 Der er 36 kommentarer og
1 løsning

Match Foto

Hej jeg søger efter et script til at se om to billder er ens men jeg kan ikke finde et script til dette og ville høre om der er en der kan hjælpe her !!!
Avatar billede thesurfer Nybegynder
30. juni 2008 - 16:56 #1
Der skal normalt en kompleks algoritme til at sammenligne billeder osv.. men du kunne f.eks. sammen
Avatar billede thesurfer Nybegynder
30. juni 2008 - 16:57 #2
Der skal normalt en kompleks algoritme til at sammenligne billeder osv.. men du kunne f.eks. sammen filerne binært..

Dvs., læse begge filer og sammenligne dem..
Avatar billede driis Nybegynder
30. juni 2008 - 18:15 #3
Hvis du vil vide om 2 billedfiler er helt ens, sammenligner du bare filerne binært byte for byte, som thesurfer er inde på. Du kan også trække hvert farveplan fra hinanden for hver pixel og tage den absolutte værdi for summen af hver; og så sætte en eller anden grænseværdi for hvornår billederne er éns. Så vil du udfra 2 billeder med samme dimensioner kunne finde ud af om de er "ens" selvom der måske er ganske små variationer.

Men hvad skal det bruges til ? Så er det nok nemmmere at svare.
Avatar billede windll Nybegynder
30. juni 2008 - 18:35 #4
Det jeg skal lave er et dll fil hvor man giver den et billede som den så ser i en mappe om den har et foto som er ens med det billede man har opgive..

Håber i kan hjælpe mig..
Avatar billede thesurfer Nybegynder
01. juli 2008 - 21:21 #5
En lille fusker kunne være at lave DLL'et sådan den arbejdede sammen med DOS-kommandoen "FC" (som vist nok står for "file compare")..

FC sammenligner 2 filer, og udskriver enten at der ikke er forskel, eller selve forskellen mellem de to filer.. FC kan også bruges til binære filer (f.eks billeder).

Man kan så redirecte outputtet fra FC til VB, så man undgår at der popper en sort DOS-box frem..

Men så er systemet afhængigt af at FC findes i det pågældende operativsystem, eller i stien som er angivet.

Det var en mulighed..

Ellers kunne man først sammenligne filstørrelserne:
- hvis filstørrelserne ikke er ens, er der ingen grund til at forsætte sammenligningen, og man tager fat i næste fil
- hvis filstøreelserne er ens, kan man læse en bid ad gangen, og sammenligne dem. Så snart at man støder på to bider (en bid fra hver fil) der ikke er ens, afslutter man sammenligningen og går videre til næste fil
Avatar billede thesurfer Nybegynder
01. juli 2008 - 21:23 #6
PS: Jeg har fortolket "ens" som værende "identiske", dvs., en kopi af filen.

Dvs, dit DLL kunne så bliver brugt til at finde dubletter.. Dubletter er nøjagtige kopier.. med andre ord: filerne skal være 100% ens.
Avatar billede windll Nybegynder
01. juli 2008 - 22:13 #7
Hej thesurfer

Jeg er ikke helt med på hvad du mender. men hvis du har et par script kan jeg jo se lidt på det.
Avatar billede windll Nybegynder
05. juli 2008 - 19:50 #8
Sikke stille i alle er blive. ville blive total glade hvis jeg kun få lidt kildkode så jeg kan komme vider..
Avatar billede thesurfer Nybegynder
05. juli 2008 - 22:44 #9
Jeg har ikke programmeret i VB i lang tid..

Men du skal sådan set bare køre/afvikle filen "fc" med de korrekte parametere, og redirect outputtet fra fc og til dit program..

Se f.eks.:

http://msdn2.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx
Avatar billede thesurfer Nybegynder
05. juli 2008 - 22:46 #10
Doh! Det er til .Net frameworket..
Avatar billede thesurfer Nybegynder
05. juli 2008 - 22:51 #12
Hvis du ikke allerede kender til rekursive funktioner (funktioner der kalder sig selv), vil jeg anbefale at du også kigger på det..

Så mangler du bare at kunne læse filerne binært, og sammenligne en bid ad gangen.. det burde du kunne finde ud af.

Ellers på http://www.planetsourcecode.com/vb/default.asp

(eller søg på nettet)
Avatar billede windll Nybegynder
09. juli 2008 - 21:06 #13
Hej thesurfer

jeg har nu prøve at finde et script jeg kun komme vider men men uden held.
Det du har (http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=32180&lngWId=1) få jeg ikke meget ud af. og kan ikke finde nåde på planetsourcecode.com

jeg ved jeg før har haft et script der kun finde ud af det men kan ikke huske hvor jeg fadt det eller hvordan det gjor.. så jeg håber du vil prøve igen..
Avatar billede thesurfer Nybegynder
10. juli 2008 - 17:42 #14
Nu skriver du "script".. Bare for at være sikker: Det er Visual Basic du mener, og ikke ASP (med f.eks. VBScript) ?

Man omtaler normalt kode som script, ved scriptsprog som f.eks. JavaScript og VBScript til f.eks. ASP..


Du skal bruge følgende:
- Et originalt billede der skal sammenlignes med
- Et eller billeder der skal sammenlignes med det originale/valgte billede
- Kode der løber mapper igennem (rekursivt)
- Kode der laver en binær sammenligning af den originale fil, og de filer der ligger i mapperne

Koden på planetsourcecode.com (se indlæg 05/07-2008 22:48:15) afvikler en DOS kommando, uden at skulle åbne den sorte DOS prompt. Dette er smart da der så ikke skal åbnes et sort vindue for hver eneste fil der sammenlignes.
Koden fra 05/07-2008 22:48:15 skal bruges til "fc" kommandoen, som kan sammenligne 2 filer. Hvis man bruger "/B" parameteren, sammenligner den binære filer.


Hvis der er en del, eller flere dele, som du enten ikke forstår, eller ikke ved hvordan kan løses, skriv venligst så jeg kan forklare det.
Avatar billede thesurfer Nybegynder
10. juli 2008 - 18:42 #15
Hvis jeg får tid senere, laver jeg programmet i C# via .NET Framework 2.0 .. dvs, du skal downloade .NET Framework 2.0:

http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=da

Husk at vælge det rigtige sprog (der er valgt dansk på linket)
Avatar billede windll Nybegynder
11. juli 2008 - 10:29 #16
Hej igen.. jo det er Visual Basic 6.0 jeg arbjder i, jeg skal lave en dll til dette da det skal bruges på en website..

jeg bliv lidt klover på det med FC. men er ikke helt klar over hvordan jeg skal bygge det. ud fra den når det skal køre i en dll fil !!!
Avatar billede windll Nybegynder
11. juli 2008 - 10:30 #17
Hele iden er at jeg skal give min dll et billedet som den så skal se om den har i forvejen..
Avatar billede thesurfer Nybegynder
11. juli 2008 - 16:08 #18
Lad os starte med at finde ud af, hvad du kan finde ud af.

Ved du hvordan du:

1) løber en mappestruktur/biblioteksstuktur igennem, dvs. den angivne mappe samt undermapper, og deres undermapper osv?

2) arbejder med filer, f.eks. checker filstørrelsen/længden?

3) afvikler eksterne filer, f.eks. et DOS/DOS-prompt program som FC?

4) omdirigerer outputtet fra DOS/DOS-prompt programmet til dit eget program/DLL?

5) læser filers indhold?
Avatar billede windll Nybegynder
11. juli 2008 - 21:23 #19
Jeg tro godt jeg kan finde ud af det. men ved ikke om den er sikker nok !!!

ville bruge FSO !!!
Avatar billede thesurfer Nybegynder
11. juli 2008 - 23:17 #20
..og så med hele sætninger der giver mening.. :-)

Du har ikke svaret på 11/07-2008 16:08:15.

Hvis man ikke selv hoster sit website, eller har en speciel aftale med dem der hoster websitet, tror jeg ikke at kan bruge DLL filer på serveren..?
Avatar billede windll Nybegynder
13. juli 2008 - 11:59 #21
Jeg har eget hosting. så dll kan jeg installer alle dem jeg vil.. ;)

Laver lige et test dll som jeg smider kill så kan du jo se om det er godt nok..
Avatar billede thesurfer Nybegynder
13. juli 2008 - 19:49 #22
Her er en vejledning i oprettelse af DLL til ASP via VB:

http://www.macronimous.com/resources/tutorials/asp_vb_dll.asp
Avatar billede windll Nybegynder
15. juli 2008 - 11:27 #23
Hej igen tak for din dll hjælp ikke fordi jeg kan bruge det til nåde da jeg godt ved hvordan man ikke hvordan jeg kan se om to filer er ens. jeg har desvære ikke altid internet lige pt da min dumme internet udbyder ikke helt kan finde ud af det..
Avatar billede windll Nybegynder
15. juli 2008 - 11:59 #24
Min kode der godt nok ikke virker helt enu.. kan ikke lige se hvad jeg gør forkere..

Public Function CheckFile(Uploadfil As String, Path As String) As String
    Set Fs = Server.CreateObject("Scripting.FileSystemObject")
        Set Folder = Fs.GetFolder(Path)
            If (Folder.SubFolders.Count > 0) Then
                For Each Item In Folder.SubFolders
                    Set sub_folder = Fs.GetFolder(Path & "/" & Item.Name)
                        For Each sub_item In sub_folder.Files
                            If (Folder.Files.Count > 0) Then
                                For Each Item In Folder.Files
                                    CheckFile = Path & "/" & Folder.Name & "/" & Item.Name
                                Next
                            End If
                        Next
                    Next
                End If
    Set sub_folder = Nothing
    Set Folder = Nothing
    Set Fs = Nothing
End Function
Avatar billede thesurfer Nybegynder
18. juli 2008 - 16:13 #25
Jeg beklager det sene svar. Jeg har gang i nogle ting, der kræver min opmærksomhed, og så har jeg ikke så meget tid til Eksperten.. og når jeg har tid, husker jeg ikke altid hvad det er jeg sidst har haft gang i..

Jeg regner med at have tid til dette projekt, i løbet af i dag/aften/nat..
Avatar billede windll Nybegynder
18. juli 2008 - 21:11 #26
Helt ok.. håber du kan hjælpe mig når du har tid igen..
Avatar billede thesurfer Nybegynder
19. juli 2008 - 04:37 #27
Nu er det godt nok noget tid siden, at jeg sidst har programmeret i Visual Basic ("classic" om man vil), men har fået bikset noget kode sammen..

Jeg har lavet noget kode, som jeg har testet i en EXE fil, både direkte og via OCX, da jeg lige have Microsoft Visual Basic 5.0 CCE (CCE = Control Creation Edition) liggende.

På min form har jeg følgende:
CommandButton, navn: btnSearch
Listbox, navn: lstResults

Jeg har fjernet "Server." fra "Server.CreateObject", da det ellers ikke vil virke i  EXE fil.

Desuden har jeg flyttet stien til den uploaded fil, til globalt område, så man ikke behøver at sende den med hver gang.

For at sikre mig at resultatet er korrekt, har jeg tilføjet en Listbox til min form, for at se de stier der kommer ud af koden. Du skal naturligvis bare erstatte denne del, med hvad end du har tænkt dig at gøre.
Jeg tilføjer stien med denne kode: lstResults.AddItem (objFile.path)

Jeg har også implementeret en "fejlhåndtering", der kan fortælle dig om der opstod fejl med de enkelte filer/mapper. På min form bliver fejlene udskrevet her:
MsgBox "Der opstod følgende fejl under gennemsøgningen:" & vbCrLf & vbCrLf & strErrors

Linien "Option Explicit" hælper med at finde stavefejl i navnene på variabler, idet man skal definere/dim'e ALLE variabler. Denne linie kan fjernes når alle tests er bestået, dvs. når koden afvikles som ønsket.

Kig venligst koden igennem og test den. Stil gerne spørgsmål hvis du er i tvivl om noget.


Hele koden som jeg har brugt:


Option Explicit
Dim strPathStart As String
Dim strFileOrg As String
Dim lngSizeOrg As Long
Dim strErrors As String

Private Sub btnSearch_Click()
' Lad os simulere at filen (uploadede fil) der skal sammenlignes er denne:
strFileOrg = "C:\temp\map.jpg"

' Lad os simulere at mappen med billederne ligger her:
strPathStart = "C:\Temp"

lngSizeOrg = FileLen(strFileOrg)
populate (strPathStart)
If strErrors <> "" Then
    ' Der er opstået mindst 1 fejl undergennemsøgningen.
    ' Vis/udskriv fejlmedelelsen, evt gem til en eller anden form for log
    MsgBox "Der opstod følgende fejl under gennemsøgningen:" & vbCrLf & vbCrLf & strErrors
End If
End Sub

Private Sub populate(path As String)
On Error GoTo ErrHandler

Dim objFSO, objFolder, objFile, objSubFolder
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.getfolder(path)

For Each objFile In objFolder.Files
    If LCase(objFile.path) <> LCase(strFileOrg) Then
        If FileLen(objFile.path) = lngSizeOrg Then
            ' Størrelsen passer med den originale fil
            ' Vi skal derfor sammenligne indholdet af filen
            If compare(objFile.path) = True Then
                ' Tilføj denne fil til en liste af en eller anden art:
                lstResults.AddItem (objFile.path)
            End If
        End If
    End If
Next

For Each objSubFolder In objFolder.Subfolders
    populate (objSubFolder.path)
Next

Set objFolder = Nothing
Set objFSO = Nothing

ErrHandler:
If Err.Number <> 0 Then
    strErrors = strErrors & Err.Number & " - " & Err.Description & vbCrLf & path & vbCrLf & vbCrLf
End If
End Sub

Private Function compare(curfile As String)
Dim blnIdentical As Boolean
blnIdentical = True
Dim baOrg() As Byte, baCur() As Byte
Dim lngIterator As Long

Dim intFileHandleOrg As Integer
intFileHandleOrg = FreeFile
Open strFileOrg For Binary Access Read As #intFileHandleOrg

Dim intFileHandleCur As Integer
intFileHandleCur = FreeFile
Open curfile For Binary Access Read As #intFileHandleCur

baOrg() = InputB(LOF(intFileHandleOrg), #intFileHandleOrg)
baCur() = InputB(LOF(intFileHandleCur), #intFileHandleCur)

For lngIterator = LBound(baOrg) To UBound(baOrg)
    If baOrg(lngIterator) <> baCur(lngIterator) Then
        blnIdentical = False
        Exit For
    End If
Next

Close #intFileHandleCur
Close #intFileHandleOrg

compare = blnIdentical
End Function
Avatar billede thesurfer Nybegynder
19. juli 2008 - 04:45 #28
Ting du skal gøre noget ved:

1) Sæt stien til den uploaded fil, i denne variabel:
strFileOrg

2) Sæt stien til mappen hvor billederne findes, i denne variabel:
strPathStart

3) Kald funktionen sådan her:
populate (strPathStart)

4) Hvad skal der ske, med de filer den finder? Det gør du her i stedet for:
lstResults.AddItem (objFile.path)

5) Hvis du vil checke for fejl, gør du det efter kaldet, sådan her:
If strErrors <> "" Then
' gør noget her med variablen strErrors, som indeholder fejlbeskrivelserne
End If


Denne kode gennemsøger alle mapper og undermapper i den angivne lokation (som sættes i variablen strPathStart), for filer der er identiske med den uploadede fil.
Man kunne evt lave en "nødbremse" som gjorde, at gennemsøgningen blev afsluttet MED DET SAMME, hvis der blev fundet en tilsvarende fil.
Avatar billede thesurfer Nybegynder
19. juli 2008 - 04:48 #29
Med "nødbremse":

Option Explicit
Dim strPathStart As String
Dim strFileOrg As String
Dim lngSizeOrg As Long
Dim strErrors As String
Dim blnBreak As Boolean

Private Sub btnSearch_Click()
' Lad os simulere at filen (uploadede fil) der skal sammenlignes er denne:
strFileOrg = "C:\temp\map.jpg"

' Lad os simulere at mappen med billederne ligger her:
strPathStart = "C:\Temp"

lngSizeOrg = FileLen(strFileOrg)
blnBreak = False
populate (strPathStart)
If strErrors <> "" Then
    ' Der er opstået mindst 1 fejl undergennemsøgningen.
    ' Vis/udskriv fejlmedelelsen, evt gem til en eller anden form for log
    MsgBox "Der opstod følgende fejl under gennemsøgningen:" & vbCrLf & vbCrLf & strErrors
End If
End Sub

Private Sub populate(path As String)
If blnBreak = True Then Exit Sub
On Error GoTo ErrHandler

Dim objFSO, objFolder, objFile, objSubFolder
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.getfolder(path)

For Each objFile In objFolder.Files
    If LCase(objFile.path) <> LCase(strFileOrg) Then
        If FileLen(objFile.path) = lngSizeOrg Then
            ' Størrelsen passer med den originale fil
            ' Vi skal derfor sammenligne indholdet af filen
            If compare(objFile.path) = True Then
                ' Tilføj denne fil til en liste af en eller anden art:
                lstResults.AddItem (objFile.path)
                blnBreak = True
                Exit Sub
            End If
        End If
    End If
Next

For Each objSubFolder In objFolder.Subfolders
    populate (objSubFolder.path)
Next

Set objFolder = Nothing
Set objFSO = Nothing

ErrHandler:
If Err.Number <> 0 Then
    strErrors = strErrors & Err.Number & " - " & Err.Description & vbCrLf & path & vbCrLf & vbCrLf
End If
End Sub

Private Function compare(curfile As String)
Dim blnIdentical As Boolean
blnIdentical = True
Dim baOrg() As Byte, baCur() As Byte
Dim lngIterator As Long

Dim intFileHandleOrg As Integer
intFileHandleOrg = FreeFile
Open strFileOrg For Binary Access Read As #intFileHandleOrg

Dim intFileHandleCur As Integer
intFileHandleCur = FreeFile
Open curfile For Binary Access Read As #intFileHandleCur

baOrg() = InputB(LOF(intFileHandleOrg), #intFileHandleOrg)
baCur() = InputB(LOF(intFileHandleCur), #intFileHandleCur)

For lngIterator = LBound(baOrg) To UBound(baOrg)
    If baOrg(lngIterator) <> baCur(lngIterator) Then
        blnIdentical = False
        Exit For
    End If
Next

Close #intFileHandleCur
Close #intFileHandleOrg

compare = blnIdentical
End Function
Avatar billede windll Nybegynder
19. juli 2008 - 11:27 #30
Fedt Jeg takker og bukker, Det var lige hvad jeg skulle bruger..
Hvis du smider et svar er point din.
Avatar billede thesurfer Nybegynder
19. juli 2008 - 20:37 #31
Her er et svar :-)
Avatar billede windll Nybegynder
24. juli 2008 - 21:56 #32
Jeg ville lige høre om du har en løsning på hvordan jeg kan få det i procent ?
Avatar billede thesurfer Nybegynder
25. juli 2008 - 00:43 #33
"få det i procent" ? - Mener du at du vil vise "progress" / "fremgang" i procent, så man kan se hvor langt den er nået?

Hvis ja, så er mit svar sådan sat set nej, hvis det skal gøres effektivt.

Hvis det ikke behøver at være effektivt, er opgaven sådan set nem nok:
- løb alle undermapperne igennem, tilføj samtlige fil-stier til en liste
- når listen er klar, kan du regne procenterne ud hver gang du kontroller en fil,

Som du muligvis har fundet ud af, kræver denne metode 2 "løkker", hvor den første løkke bare samler oplysningerne, og den anden faktisk udfører kontrollen.

Du støder også på et andet problem:
Hvordan skal procenterne "udskrives" tilbage til brugeren?
- ASP kan ikke skakke med JavaScript, og JavaScript kan ikke snakke med ASP.
- ASP kan dog udskrive noget JavaScript-kode, som derefter fortolkes som JavaScript

Eksempel hvor variablen "MyVar" indeholder "Hello World":

response.write "<script type='text/javascript'>"
response.write "alert('" & MyVar & "');"
response.write "</script>"

vil blive udskrevet som:

<script type='text/javascript'>
alert('Hello World');
</script>

ASP har ikke kommunikeret med JavaScript. ASP har bare udskrevet noget, som fortolkes som JavaScript.

ASP afvikles FØR JavaScript.

Jeg håber at det er svar nok.. ellers må du lige sige til.
Avatar billede thesurfer Nybegynder
25. juli 2008 - 00:44 #34
minus "sat" i "sådan sat set"
Avatar billede windll Nybegynder
28. juli 2008 - 21:40 #35
Mit problem er jeg godt kan have to foto der er ens bare ikke helt måske lidt lyser eller nåde..
Avatar billede thesurfer Nybegynder
29. juli 2008 - 20:16 #36
Hvis det ene billede er lysere/mørkere end det andet, så er billederne ikke ens :-)

Hvis du skal til at sammenligne billeder, som faktisk billeder i stedet for bare filer, skal man bruge nogle seriøse algoritmer (vil jeg tro).

Man kunne muligvis sammenligne filerne, og se på hvor mange punkter filerne var ens (f.eks. 70% fællestræk = ens filer, eller noget i den stil). Men jeg ved ikke hvor forskellige de faktisk er, når den ene er lysere/mørkere..

Det er nok noget af en opgave..
Avatar billede driis Nybegynder
29. juli 2008 - 23:47 #37
Min kommentar 30/06-2008 18:15:41 beskriver den simpleste måde at lave en sådan beregning. (At trække pixel-værdier fra hinanden og enten anvende et gennemsnit eller se på summen - hvilken værdi der skal være threshold for "ens" er så en øvelse for dig selv).

Blot duer det selvfølgelig ikke hvis ikke billedfilerne ikke har samme højde/bredde dimension (man kunne evt. resize først). Desuden er det nødvendigt at se på pixel værdier i hvert farveplan og ikke blot de enkelte bytes i filen (idet noget af det er header, der kan være forskelle i anvendt kompressionsalgoritme osv.).
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
Kategori
Kurser inden for grundlæggende programmering

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