Php script uitvoeren
alvast bedankt,
2 5havo studenten die graag wat willen leren over php voor hun profielwerkstuk. Dit is het script:
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?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);
}
// create images
$i1 = @imagecreatefromstring(file_get_contents($argv[1]));
$i2 = @imagecreatefromstring(file_get_contents($argv[2]));
// 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);
}
// create a diff image
$diffi = imagecreatetruecolor($sx1, $sy1);
$green = imagecolorallocate($diffi, 0, 255, 0);
imagefill($diffi, 0, 0, imagecolorallocate($diffi, 0, 0, 0));
// increment this counter when encountering a pixel diff
$different_pixels = 0;
// loop x and y
for ($x = 0; $x < $sx1; $x++) {
for ($y = 0; $y < $sy1; $y++) {
$rgb1 = imagecolorat($i1, $x, $y);
$pix1 = imagecolorsforindex($i1, $rgb1);
$rgb2 = imagecolorat($i2, $x, $y);
$pix2 = imagecolorsforindex($i2, $rgb2);
if ($pix1 !== $pix2) { // different pixel
// increment and paint in the diff image
$different_pixels++;
imagesetpixel($diffi, $x, $y, $green);
}
}
}
if (!$different_pixels) {
echo "Image is the same";
exit(0);
} else {
if (empty($argv[3])) {
$argv[3] = 'diffy.png'; // default result filename
}
imagepng($diffi, $argv[3]);
$total = $sx1 * $sy1;
echo "$different_pixels/$total different pixels, or ", number_format(100 * $different_pixels / $total, 2), '%';
exit(1);
}
?>
/**
* 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);
}
// create images
$i1 = @imagecreatefromstring(file_get_contents($argv[1]));
$i2 = @imagecreatefromstring(file_get_contents($argv[2]));
// 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);
}
// create a diff image
$diffi = imagecreatetruecolor($sx1, $sy1);
$green = imagecolorallocate($diffi, 0, 255, 0);
imagefill($diffi, 0, 0, imagecolorallocate($diffi, 0, 0, 0));
// increment this counter when encountering a pixel diff
$different_pixels = 0;
// loop x and y
for ($x = 0; $x < $sx1; $x++) {
for ($y = 0; $y < $sy1; $y++) {
$rgb1 = imagecolorat($i1, $x, $y);
$pix1 = imagecolorsforindex($i1, $rgb1);
$rgb2 = imagecolorat($i2, $x, $y);
$pix2 = imagecolorsforindex($i2, $rgb2);
if ($pix1 !== $pix2) { // different pixel
// increment and paint in the diff image
$different_pixels++;
imagesetpixel($diffi, $x, $y, $green);
}
}
}
if (!$different_pixels) {
echo "Image is the same";
exit(0);
} else {
if (empty($argv[3])) {
$argv[3] = 'diffy.png'; // default result filename
}
imagepng($diffi, $argv[3]);
$total = $sx1 * $sy1;
echo "$different_pixels/$total different pixels, or ", number_format(100 * $different_pixels / $total, 2), '%';
exit(1);
}
?>
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:
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
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);
$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:
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
alvast bedankt
$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.
achter $different_pixels staat ook al een puntkomma, dat gaat ook niet werken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);
}
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:
maar ook dit houdt geen rekening met <= 10, kan iemand me vertellen waarom niet? want zelf krijg ik het niet werkend.
Dus statement NIET kleiner gelijk dan 10 (met andere woorden, groter dan 10):
Dat kan ook gewoon zo:
Gewijzigd op 04/12/2011 20:58:39 door Jurgen B
En doe eens een echo $different_pixels/$total; zodat je ook weet wat daar dus uitkomt.
nu kan ik weer verder knutselen aan mn scriptje :)
bedankt
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.