Zugriff auf anderen Server / Duplikate verhindern

chris4712

Erfahrenes Mitglied
Hallo!

Um mein Problem zu erklären muss ich leider ein wenig ausholen.
Ich baue (immer noch) an einem Webseitenverwaltungsprogramm. Dies liegt auf meinem Server.
Die Besitzer der Webseiten können sich einloggen und dann ihre Webseite bzw. den Inhalt bearbeiten. Diese Webseiten bzw. deren Daten liegen auf anderen Servern.
Nun wollte ich ein Galerieverwaltungsprogramm hinzufügen. Funktionsweise ist wie folgt:
Der Benutzer lädt ein Bild hoch. Dieses wird erst einmal verkleinert. Dann wird mit der PHP Funktion imagecolorat() jedes schon vorhandene Bild mit dem neuen verglichen, um Duplikate zu verhindern.
Wenn das Bild neu ist, soll ein Eintrag in der MySQL DB erfolgen und das Bild auf den Kundenserver (per FTP) verschoben werden.
Soweit meine Vorstellung.
Nun zu meinem "Problem". Das Vergleichen an sich geht. Aber es dauert doch recht lange die Bilder vom anderen Server aufzurufen.

Ich bräuchte nun mal eine Idee wie ich die Duplikate schneller finden kann, bzw. nicht die ganzen Bilder runter laden muss.

Gruß

Christian
 
Erste Idee von mir selbst. Aber ist die Gut

Mir ist grade eine Idee gekommen, wozu ich aber gerne noch mal eure Meinung hätte:
Ich speichere die Informationen (aufgenommen am, Beschreibung usw.) über die Bilder ja in einer MySQL Tabelle.
Wenn ich da nun zusätzlich noch die Breite und Höhe sowie die mit imagecolorat() ermittelten Farbwerte (habe festgestellt das 48 Punkte eigentlich reichen um einen eindeutigen Übereinstimmung zu finden) speichern würde, müsste ich ja nicht die Bilder sondern nur die Daten aus der MySQL Tabelle vom Kunden laden.
Geht das schneller, bzw. fällt euch dabei was negatives auf?
 
Hi
Ansich etwas schwierig...
Sollen auch "gleiche" Bilder, die allerdings z.b. unterschiedlich stark komprimiert wurden, als gleich erkannt werden? Denn da gibt es ja Abweichungen aufgrund des Datenverlustes.
Letztere Idee gefällt mir ganz gut. Ich würde die Daten der 48 Punkte in RGB-Form (3 Bytes je Pixel) aneinanderhängen (somit ein Byte-Array) um Platz zu sparen, was bei größeren Galerien relevant sein könnte.
Dann ist es wichtig, bei der Abtastung des neuen Bildes auch erst die 48 * 3 Bytes zu "lesen" und diese dann "am Stück" mit den Datensätzen vergleichen. Geht wohl am schnellsten, im Gegensatz zu 48 einzelnen Daten...
 
Hey!

Also ich habe bei der Vergleichfunktion eine Toleranz eingebaut.
Bei den mit imagecolorat() ermittelten Wert darf der vergleichbare Pixel im anderen Bild eine Abweichung von +/- 4500000 haben.

Ich habe mich eben vielleicht falsch ausgedrückt. Ich nehme nicht die ersten 48Pixel am Stück, sondern habe zwei for Schleifen die eigentlich von 1 bis BreiteDesBildes und 1 bis HoheDesBildes laufen. Jedoch zähle ich nicht den Faktor 1 sondern 25 hinzu. Springt also immer.

Aber dies kann ich ja dann noch nach belieben ändern. Nur halt dann nachher nicht mehr.

Die ersten 48 Pixel wäre nicht gut, wiel z.B. der Himmel meistens blau ist :)
Gruß!
 
ja das war mir auch klar ;-)
ich würde das bild in einem raster abtasten das dann z.b. 8 x 8 felder groß ist, d.h. unabhängig von der größe des bildes werden die gleiche anzahl an pixeln getestet und dann spielt es auch keine rolle wenn jemand das bild vorher kleiner gemacht hat, es bleibt noch das "gleiche".

Ich würde nicht den Farbwert vergleichen sondern die R, G und B werte Sonst bringt dir die Toleranz nichts, es werden z.b. Blauwerte gar nicht mehr beachtet, da diese nur +/- 256 am Wert ausmachen. Grünwerte machen +/- 65536 am Wert aus, werden also auch nicht beachtet. Du müsstest den Farbwert unterteilen. Also wenn ich die Funktion noch richtig in Erinnerung habe, dann packt sie die R, G und B Werte hintereinander, d.h.
Farbwert = B + 256*G + 256*256*R

Irre ich mich, so korrigiere mich ;-)
 
OK, über den RGB Wert bzw. wie ich den auslese muss ich mich noch mal schlau machen. Hab es bis jetzt immer nur mit imagecolorat() gemacht.

Das mit dem Raster habe ich noch nicht ganz verstanden.
Angenommen ein Bild ist 200 x 150PX groß.
Dann wären wir, um bei deinen 8x8 Raster zu bleiben mit einer 25x18,75PX großen Rasterung dabei.
Soll ich dann die RGB Werte von einem "Block" alle addieren?
 
Nein du hast mich falsch verstanden: ich meine 8 x 8 Felder in der Anzahl, nicht als Größe!
Sozusagen geachtelt! Verwende als Schrittwert width/8 bzw height/8.
Wart mal ich schau kurz nach wie das mit dem RGB geht dann schick ich dir den COde dazu.
 
so, hab nach geschaut, und bin auf selfphp.de fündig geworden:
imagecolorat() gibt nicht den Farbwert, sondern den Farbindex an (bei TrueColor-Bildern eigentlich sinnlos, aber naja, so isses halt)

Wenn $farbe_b der Index der Farbe ist (imagecolorat), dann bekommst du die 3 Werte für Red, Green und Blue so:

$rgb = imagecolorsforindex ( $image, $farbe_b );

echo 'RGB-Wert für rot: ' . $rgb[red] . '<br>';
echo 'RGB-Wert für grün: ' . $rgb[green] . '<br>';
echo 'RGB-Wert für blau: ' . $rgb[blue];

(Beispiel aus selfphp.de)

Diese musst du dann einzeln vergleichen, und da reicht als Toleranz 20.
 
OK, ich versuch es grad mal.
Wobei ich noch mal schauen muss wie viele Pixel höchstens miteinander verglichen werden müssen, um ein Bild eindeutig zu machen...
Ist ja alles eine Frage der Speicherkapazität und somit der Geschwindigkeit. :)
Aber schon mal Danke! Ich meld mich gleich noch mal.
 
Zurück