30. juni 2008 - 16:14Der 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 !!!
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
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.
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
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..
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.
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..
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
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..
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
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.
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
"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":
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..
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.).
Synes godt om
Ny brugerNybegynder
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.