PHP Check of image reeds bestaat
ik zoek naar een script dat nakijkt of een afbeelding meermaals voorkomt op de server.
Korte uitleg: ik heb een achtergrondensite en ik zou willen nagaan of er in de hele collectie geen dubbele achtergronden staan. Ik dacht aan een bepaalde manier, maar weet niet hoe ik dit in script kan omzetten.
De manier: Van alle achtergronden 1 pixel selecteren, de kleur onthouden en controleren met alle andere achtergronden om te zien of de kleur overeenkomt. Komt de kleur overeen, is er waarschijnlijk een dubbel.
Bestaat er een script, of weet iemand hoe je dit nog kunt nagaan?
Liefst in PHP, maar als het niet anders gaat mag het ook een andere taal zijn.
Met vriendelijke groet,
Rubenvh
Dat gaat volgens mij nooit werken.. Als ik bijvoorbeeld een blauwe eend upload en een blauwe fiets is dat dus hetzelfde volgens jouw?
Gewijzigd op 16/07/2010 16:25:47 door Niels K
Achtergronden gaan zelden op 1 bepaalde plaats van 1px² exact dezelfde kleur hebben, tenzij het gewoon een volledig (in jouw geval) blauw vlak heeft.
Onze achtergronden zullen nooit volledige blauwe vlakken hebben, dus mijn idee zou volgens mij wel kunnen werken.
Alleen de vraag: hoe?
http://www.php.net/manual/en/function.imagecolorsforindex.php
Ik zou het wel gebruiken bij het opslaan van de afbeelding en dan de data opslaan in een database. Ik heb hem nooit gebruikt maar het lijkt me nogal server intensief.
Ik zou het wel gebruiken bij het opslaan van de afbeelding en dan de data opslaan in een database. Ik heb hem nooit gebruikt maar het lijkt me nogal server intensief.
Daaruit komt dan een rgb kleur die ik omzet naar een hex
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function rgb2html($r, $g=-1, $b=-1){
if (is_array($r) && sizeof($r) == 3)
list($r, $g, $b) = $r;
$r = intval($r);
$g = intval($g);
$b = intval($b);
$r = dechex($r<0?0:($r>255?255:$r));
$g = dechex($g<0?0:($g>255?255:$g));
$b = dechex($b<0?0:($b>255?255:$b));
$color = (strlen($r) < 2?'0':'').$r;
$color .= (strlen($g) < 2?'0':'').$g;
$color .= (strlen($b) < 2?'0':'').$b;
return '#'.$color;
}
?>
function rgb2html($r, $g=-1, $b=-1){
if (is_array($r) && sizeof($r) == 3)
list($r, $g, $b) = $r;
$r = intval($r);
$g = intval($g);
$b = intval($b);
$r = dechex($r<0?0:($r>255?255:$r));
$g = dechex($g<0?0:($g>255?255:$g));
$b = dechex($b<0?0:($b>255?255:$b));
$color = (strlen($r) < 2?'0':'').$r;
$color .= (strlen($g) < 2?'0':'').$g;
$color .= (strlen($b) < 2?'0':'').$b;
return '#'.$color;
}
?>
Dit kan ik dan voor elke achtergrond doen, en de kleur opslaan in database (eventueel op 4 verschillende punten de kleur opnemen). Hoe kan ik op de meest efficiente manier alle waarden met elkaar vergelijken en zoeken naar dubbels?
Gewijzigd op 16/07/2010 16:51:32 door Ruben Vanhoeyveld
Het makkelijkste is om de hash (bijvoorbeeld md5file) te nemen van het bestand, en deze in een database opslaan.
Dan heb je misschien duplicaten als het bestand door een tekenprogramma opnieuw is opgeslagen, maar dat neem je dan maar voor je lief.
Als de douane jouw paspoort controleert kijken ze ook naar de foto, en gaan ze niet jou millimeter voor millimeter meten en vergelijken met de pasfoto.
even de naam veranderen en een nieuwe uploaden en dan heb je twee identieke achtergronden met een andere naam...
Met je paspoorten zou het dan om vervalsing ofzo gaan:p
Of bedoel je iets anders?
Edit: heb het even opgezocht en begrijp je. Dit is inderdaad efficiënter... Maar ik heb nu een database van meer dan 1000 achtergronden... hoe laat ik ze allemaal met elkaar vergelijken om dubbels te vinden?
Gewijzigd op 17/07/2010 01:40:05 door Ruben Vanhoeyveld
Ruben Vanhoeyveld op 17/07/2010 01:34:41:
Edit: heb het even opgezocht en begrijp je. Dit is inderdaad efficiënter... Maar ik heb nu een database van meer dan 1000 achtergronden... hoe laat ik ze allemaal met elkaar vergelijken om dubbels te vinden?
Door tijdens het opslaan de hash van de achtergrond in de database te zetten. De kolom in je tabel die je daarvoor gebruikt kan je een UNIQUE index geven, waardoor het simpelweg technisch onmogelijk wordt om tweemaal dezelfde achtergrond toe te voegen. Ik neem aan dat je informatie over de achtergrond ergens opslaat, en niet alleen de jpegs zelf, en anders is dit een mooi moment om daarmee te beginnen.
Als je van al je achtergronden de hash hebt, kan je daarna vrij gemakkelijk een query schrijven die de dubbele hashes vindt. Volgens mij werkt dit al (Google even op de werking van RIGHT JOIN om hem te begrijpen):
Het 'probleem' is nu dat alles al in de database staat, en dat ik het nu zo moet nakijken.
EDIT: ik heb de kolom uniek gemaakt en kreeg een paar errors van dubbels:)
Nu zijn alle dubbels eruit en kan ik in het php script een stukje toevoegen zodat er geen dubbels meer in geraken:)
ALLEN BEDANKT!
Gewijzigd op 17/07/2010 02:02:38 door Ruben Vanhoeyveld
Uit mijn hoofd is dat 1062, dus je controle zou er dan zo uit kunnen zien:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$sql = "INSERT INTO ...";
if(!$res = mysql_query($sql)) {
if(mysql_errno() == 1062) {
// Duplicate entry
}
else {
// Andere sql error
}
}
?>
$sql = "INSERT INTO ...";
if(!$res = mysql_query($sql)) {
if(mysql_errno() == 1062) {
// Duplicate entry
}
else {
// Andere sql error
}
}
?>