Voor mijn pws zijn we bezig om afbeeldingen te vergelijken. Daarvoor denken we gebruik te kunnen maken van het volgende script (niet zelf geschreven). Na wat zoeken komen we er echter nog niet echt uit hoe we het moeten gebruiken. Wel zien we dat het er gebruik word gemaakt van een command line (task manager) maar hoe of wat verder weten we niet. We hopen dat iemand ons iets duidelijk kan maken hierover. Ook zijn we wel benieuwd of we dit dan ook op een webpagina zouden kunnen krijgen, dit omdat we wel ervaring hebben met html/css maar php nog een beetje onduidelijk is,
alvast bedankt,
2 5havo studenten die graag wat willen leren over php voor hun profielwerkstuk. Dit is het script:
<?php
/**
* Shell script to tell if two images are identical.
* If not, a third image is written - black background with the different pixels painted green
* Code partially inspired by and borrowed from http://pear.php.net/Image_Text test cases
*/
// check if there's enough input
if (empty($argv[1]) || empty($argv[2])) {
echo 'gimme at least two image filenames, please.', "\n";
echo 'e.g. "php idiff.php img1.png img2.png"';
echo "\n", 'third filename is the image diff, optional, default is "diffy.png"';
exit(1);
}
// check if we were given garbage
if (!$i1) {
echo $argv[1] . ' is not a valid image';
exit(1);
}
if (!$i2) {
echo $argv[2] . ' is not a valid image';
exit(1);
}
// dimensions of the first image
$sx1 = imagesx($i1);
$sy1 = imagesy($i1);
// compare dimensions
if ($sx1 !== imagesx($i2) || $sy1 !== imagesy($i2)) {
echo "The images are not even the same size";
exit(1);
}
nou inmiddels is het me gelukt om het uit tevoeren door middel van een usb webserver =D, commandline is nog niet aanwezig (gewoon input door de code te veranderen dus maar dat komt nog wel).
mocht ik nog wat willen weten dan post ik wel weer.
nu ik er een beetje achter ben hoe php werkt en het script aardig door heb wil ik het graag uitbreiden/aanpassen.
het idee is om het hierboven genoemde script uit te voeren. waarbij het eerste plaatje een 'wit' plaatje is. en dan het tweede plaatje een plaatje word met een vorm, laten we zeggen een blokje. zo zal de uitkomst van het script zijn dat ze niet hetzelfde zijn. nu wil ik echter niet een percentage zien van de afwijking maar benoeming van de afwijking. dit door ipv het percentage uit te rekenen, het script blokje.php te starten. Dit is hetzelfde script maar dan niet een wit plaatje maar één met een blokje. zo zal het plaatje waar vergeleken word wel hetzelfde zijn/of er flink op lijken. ik zou graag dan zien dat ik de afwijking uitreken, dit zal dan misschien 5% zijn. dit valt binnen een bijvoorbeeld op max 10 vastgestelde marge en dan wil ik dat het script ziet dat het een blokje is. nu heb ik daar dit voor bedacht:
imagepng($diffi, $argv[3]);
$total = $sx1 * $sy1;
if ((!$different_pixels/$total $different_pixels;) < 10);
{
echo 'blokje';
}
else
{
echo 'nou het is dus geen blokje, laat ik verder zoeken';
}
exit(1);
dit stukje code is ook in het bovenste script tevinden, maar het gaat nu even niet om het geheel dus vandaar. Echter deze code werkt niet, kan iemand mij hierbij helpen. heb al verschillende dingen geprobeerd maar krijg momenteel nog deze foutmelding:
Parse error: syntax error, unexpected T_VARIABLE in I:\PWS\Usb Webserver v7\UsbWebserver\Root\blokje.php on line 61
line 61 is:
if ((!$different_pixels/$total $different_pixels;) < 10);
iemand weet wat daar mis mee is? ja ik ben nog niet heel erg ervaren met php zoals men ziet, maar hoop dat er hier mensen zijn die me graag willen helpen met ervaring krijgen :D
$different_pixels/$total geeft een resultaat en $different_pixels ook neem ik aan. En die twee resultaten (met een spatie ertussen => error) samen worden vergeleken met 10. Achter de if() staat een puntkomma en dat wil zeggen dat if() daar klaar is.
oke. ik ben er weer mee bezig geweest. heb wat geprobeerd en heb uiteindelijk nu dit staan:
if (!$different_pixels) {
echo "Afbeeldingen zijn hetzelfde";
exit(0);
} else {
if (empty($argv[3])) {
$argv[3] = 'verschil.png'; // default result filename
}
imagepng($diffi, $argv[3]);
$total = $sx1 * $sy1;
if (!$different_pixels/$total <= 10)
{
echo 'blokje';
}
else
{
echo 'cola';
}
exit(1);
}
nu krijg ik na het uitvoeren als uitkomst zegmaar 'blokje'. Geen foutmeldingen meer dus. Dit is opzich goed, alleen klopt het niet, want de afwijking is groter dan 10 (dat is zeker =p). Dus houdt de code geen rekening met mn ' <= 10 '. Ik weet alleen niet waar dit aan ligt.
ook ben ik tot de conclusie gekomen dat het aantal afwijkende pixels misschien niet helemaal de goede benadering is voor het 'ongeveer vergelijken' van afbeeldingen. Daarom heb ik ook stukje code om het als percentage uit te rekenen geplaatst, namelijk deze:
if (!number_format(100 * $different_pixels / $total, 2) <= 10)
maar ook dit houdt geen rekening met <= 10, kan iemand me vertellen waarom niet? want zelf krijg ik het niet werkend.
Waar wil je de ! (not) operatie op uitvoeren? Als je statement als volgt moet zijn: niet kleiner of gelijk dan 10, dan moeten er nog een paar haakjes omheen (de hele expressie). Dit of gewoon je vergelijking omdraaien.
Dus statement NIET kleiner gelijk dan 10 (met andere woorden, groter dan 10):
lol, het lag aan dat uitroepteken. weet ook niet waarom ik hem daar had staan. ik ging ervanuit dat t moest werken, dus heb ik alleen maar getest met een afbeelding waarbij het verschil dus groter als 10 procent was. naja. ook weer wat geleerd :)
nu kan ik weer verder knutselen aan mn scriptje :)
bedankt
nou, het script werkt inmiddels.
ik kan afbeeldingen vergelijken en daaruit opmaken of het bijvoorbeeld een driehoek of een vierkant is (moet je wel eerst een voorbeeld van een driehoek/vierkant opslaan en ik code noemen, maar dat is oke).
maar nu is het zo dat we een foto als input uit een webcam willen halen. Deze foto kan ik dan wel opslaan, maar deze zal nooit dezelfde naam krijgen. Dat is een beetje een probleem nu. Namelijk, in de code zet je de naam van de foto die je vergelijkt, maar het is niet te doen om altijd die naam maar weer te veranderen telkens als je een nieuwe foto als input doet. Daarom is mijn vraag, weten jullie of er iets is waarmee ik óf altijd de 'nieuwste' foto kan pakken uit een map, of iets waarmee ik de foto altijd hernoem tot éénzelfde naam en dan de oude foto verwijder ofso.