PHP Check of image reeds bestaat

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ruben Vanhoeyveld

Ruben Vanhoeyveld

16/07/2010 16:09:23
Quote Anchor link
Hallo,

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
 
PHP hulp

PHP hulp

24/11/2024 06:19:50
 
Niels K

Niels K

16/07/2010 16:25:33
Quote Anchor link
"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."

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
 
Ruben Vanhoeyveld

Ruben Vanhoeyveld

16/07/2010 16:34:37
Quote Anchor link
Dag Niels,

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

- Mark -

16/07/2010 16:39:24
Quote Anchor link
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.
 
Ruben Vanhoeyveld

Ruben Vanhoeyveld

16/07/2010 16:50:09
Quote Anchor link
dat is ongeveer wat ik zocht van functie.

Daaruit komt dan een rgb kleur die ik omzet naar een hex

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>


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
 
P Lekensteyn

P Lekensteyn

16/07/2010 21:39:03
Quote Anchor link
De hash ervan nemen die je controleert.
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.
 
Ruben Vanhoeyveld

Ruben Vanhoeyveld

17/07/2010 01:34:41
Quote Anchor link
een hash van de file? bedoel je dan de filename?

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

Jelmer -

17/07/2010 01:46:35
Quote Anchor link
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):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
    a.id,
    b.id
FROM
    backgrounds as a
RIGHT JOIN background as b ON
    b.hash = a.hash
 
Ruben Vanhoeyveld

Ruben Vanhoeyveld

17/07/2010 02:00:23
Quote Anchor link
ik begrijp wat je bedoelt met het nakijken tijdens het opslaan... en alle gegevens staan in de database.

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
 
Joren de Wit

Joren de Wit

17/07/2010 11:37:08
Quote Anchor link
Als je een UNIQUE constraint op de kolom hebt aangebracht, zul je merken dat het ook niet meer mogelijk is om dubbele waarden in te voeren in die kolom. In PHP is dit zelfs heel eenvoudig te controleren door naar het foutnummer te kijken dat MySQL terug geeft als de INSERT query om die reden mislukt.

Uit mijn hoofd is dat 1062, dus je controle zou er dan zo uit kunnen zien:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
  }
}

?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.