Php script uitvoeren

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jordi Wippert

Jordi Wippert

30/11/2011 12:40:46
Quote Anchor link
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:

Quote:
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
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);
}

?>
 
PHP hulp

PHP hulp

11/01/2025 08:00:59
 
Jacco Brandt

Jacco Brandt

30/11/2011 14:00:23
Quote Anchor link
Hier staat wel wat interessante informatie over vermeld op php.net:
http://www.php.net/manual/en/features.commandline.usage.php
 
Jordi Wippert

Jordi Wippert

01/12/2011 11:02:11
Quote Anchor link
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.
 
Jordi Wippert

Jordi Wippert

02/12/2011 17:48:21
Quote Anchor link
update/new question :)

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


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

alvast bedankt
 
- SanThe -

- SanThe -

02/12/2011 18:17:51
Quote Anchor link
$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.
 
Erwin H

Erwin H

02/12/2011 18:44:36
Quote Anchor link
achter $different_pixels staat ook al een puntkomma, dat gaat ook niet werken.
 
Jordi Wippert

Jordi Wippert

04/12/2011 20:32:40
Quote Anchor link
oke. ik ben er weer mee bezig geweest. heb wat geprobeerd en heb uiteindelijk nu dit staan:

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
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);
}


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:

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

Jurgen B

04/12/2011 20:56:43
Quote Anchor link
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):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (!($different_pixels/$total <= 10))


Dat kan ook gewoon zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if ($different_pixels/$total > 10)
Gewijzigd op 04/12/2011 20:58:39 door Jurgen B
 
- SanThe -

- SanThe -

04/12/2011 21:21:16
Quote Anchor link
En doe eens een echo $different_pixels/$total; zodat je ook weet wat daar dus uitkomt.
 
Jordi Wippert

Jordi Wippert

04/12/2011 21:27:09
Quote Anchor link
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
 
Jordi Wippert

Jordi Wippert

07/12/2011 09:29:46
Quote Anchor link
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.
 



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.