Toon posts:

[PHP] Dynamisch plaatje

Pagina: 1
Acties:
  • 52 views sinds 30-01-2008

Verwijderd

Topicstarter
Beste ...

Ik wil een dynamisch plaatje laten weergeven op mijn site dat telkens een andere 3 letterige/cijferige code laat zien. Ik heb gezocht op internet en DB Library gedownload en geinstalleerd. Vervolgens een script op mijn site gezet en het plaatje komt er te staan (tot zo ver geen probleem) maar ik krijg het niet voor elkaar om telkens een andere tekst te laten zien.

Dit is mijn code:

code:
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
<?php
   // Maak een PNG header
   header("Content-type: image/png");
   
   // Kopieer het plaatje van een reeds bestaand bestandje
   $plaatje = ImageCreateFromPNG("button.png");
   $zwart = ImageColorAllocate($plaatje, 333, 111, 255);
   
   // Zoek hoe breed en hoe hoog de tekst gaat worden
   if (!isset($text)) $text = "[b]Hier vul ik de tekst in die op het plaatje moet komen te staan[/b]";
   $font = "verdanab.ttf";
   $box = ImageTTFBBox(16, 0, $font, $text);
   $hoogte  = $box[1] - $box[7];
   $breedte = $box[2] - $box[0];
   
   // Bereken de "default" coordinaten
   $x_coordinaat = $box[0];
   $y_coordinaat = $hoogte - $box[1];
   
   // Bereken nu de verschuiving die nodig is om de tekst de centreren
   $offset_x = (int)((ImageSX($plaatje) - $breedte) / 2);
   $offset_y = (int)((ImageSY($plaatje) - $hoogte) / 2) - 2;
   
   // Teken de tekst
   ImageTTFText($plaatje, 16, 0,
      $x_coordinaat + $offset_x,
      $y_coordinaat + $offset_y,
      $zwart, $font, $text);
   
   // Schrijf de ouput weg
   ImagePNG($plaatje);
   ImageDestroy($plaatje);
?>


Zoals je ziet heb ik een mogelijkheid om tekst op het plaatje te laten weergeven maar ik wil dus elke keer een andere tekst laten zien.


Als tweede vraag heb ik hoe ik het voor elkaar krijg om:

als ik dus elke keer een andere tekst op het plaatje krijg, de gebruiker de code in te laten typen en dan via een script te controleren of die code klopt. (dit wordt ook gebruikt bij registratieformulieren, een voorbeeld is bij hotmail.com)

  • mithras
  • Registratie: Maart 2003
  • Niet online
Verwijderd schreef op zondag 21 mei 2006 @ 16:16:
PHP:
1
if (!isset($text)) $text = "[b]Hier vul ik de tekst in die op het plaatje moet komen te staan[/b]"
Als je if-> then bedoeld moet het eerder zijn:
PHP:
1
if (!isset($text)) {$text = "[b]Hier vul ik de tekst in die op het plaatje moet komen te staan[/b]"}
:?

/edit: dus met { [...] } ;)

[ Voor 8% gewijzigd door mithras op 21-05-2006 16:20 . Reden: Verschil toegevoegd ]


  • PowerSp00n
  • Registratie: Februari 2002
  • Laatst online: 17-11-2025

PowerSp00n

There is no spoon

Mithras86 schreef op zondag 21 mei 2006 @ 16:19:
[...]

Als je if-> then bedoeld moet het eerder zijn:
PHP:
1
if (!isset($text)) {$text = "[b]Hier vul ik de tekst in die op het plaatje moet komen te staan[/b]"}
:?

/edit: dus met { [...] } ;)
Nee hoor...

Maar wat jij wil kun je bijv ook met deze PEAR module doen: http://pear.php.net/package/Text_CAPTCHA

[ Voor 16% gewijzigd door PowerSp00n op 21-05-2006 16:25 ]


Verwijderd

Topicstarter
Dat lost mijn probleem niet op,

Ik kan nu zelf de tekst invullen die ik op het plaatje wil laten zien, maar ik wil dus dat er elke keer automatisch een andere 3 cijferige/letterige code komt te staan

  • Superboer12
  • Registratie: Februari 2004
  • Laatst online: 08-02 22:37
Dit kun je bereiken door 'mt_rand' en 'chr' te combineren.

Infinitus est numerus stultorum


  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op zondag 21 mei 2006 @ 16:22:
Dat lost mijn probleem niet op,

Ik kan nu zelf de tekst invullen die ik op het plaatje wil laten zien, maar ik wil dus dat er elke keer automatisch een andere 3 cijferige/letterige code komt te staan
Via rand(int min,int max) kun je een reeks codes geneneren, die je met chr(int ascii) om kunt zetten in leesbare ASCII tekst. Voor een kleine letter kun je bijvoorbeeld chr(rand(97,122)) gebruiken.

Verwijderd

Topicstarter
Oke bedankt mensen, ik ga het even proberen.

Ik heb nu dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
function keygen() {
  $tempstring = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ";
  for($length = 0; $length != 3; $length++) {
   $temp = str_shuffle($tempstring);
   $char = mt_rand(0, strlen($temp));
   $pass .= $temp[$char];
  }
  return $pass;
 }
 echo(keygen());
 ?>


hij maakt dus een 3 letterige code aan, nu alleen nog voor elkaar krijgen om dat te combineren met die afbeelding


//edit deze code klopt niet want als ik een aantal keer een code laat generen zie ik dat hij soms ook met een 2 letterige code komt

[ Voor 22% gewijzigd door Verwijderd op 21-05-2006 17:07 ]


  • RammY
  • Registratie: Oktober 2001
  • Laatst online: 04-02 17:24

RammY

Dát!

Misschien om even in te haken op dit topic.

Modbreak:Misschien ook even niet :/

[ Voor 177% gewijzigd door BtM909 op 21-05-2006 18:46 ]

Deze advertentieplaats is te huur!


  • [BoSS]
  • Registratie: Maart 2000
  • Laatst online: 21-02 10:56

[BoSS]

Geen woorden maar daden!

RammY schreef op zondag 21 mei 2006 @ 17:07:
Maar dat ie dat dan om de zoveel sec refresht.. waarschijnlijk is het antwoord nee maar toch wil ik het ff vragen ;)
Dit is (voor zover ik weet, nog nooit geprobeerd) mogelijk met het toevoegen van een 'refresh'-header, bovenaan je script. Zie PHP.net voor meer informatie.

[ Voor 7% gewijzigd door [BoSS] op 21-05-2006 17:14 ]

20x 170 Wp (Solar Frontier) op ZZO / 54 graden


  • Mafioso
  • Registratie: November 2000
  • Laatst online: 15-02 11:52
RammY schreef op zondag 21 mei 2006 @ 17:07:
Misschien om even in te haken op dit topic. Is het ook mogelijk om de inhoud van een dynamisch plaatje te laten refreshen?

Ik heb nu:
[afbeelding]

Maar dat ie dat dan om de zoveel sec refresht.. waarschijnlijk is het antwoord nee maar toch wil ik het ff vragen ;)
Zodra ik dat plaatje (met m'n webbrowser) heb opgehaald zal hij niet meer veranderen, als ik hem niet opnieuw ophaal, als je dat bedoelt. Als dat plaatje op een website staat zou je met javascript dat plaatje om de zoveel seconden opnieuw kunnen laten ophalen.

(je code is dan ook niet relevant :P, een plaatje zelf kan geen refresh request oid sturen)

[ Voor 7% gewijzigd door Mafioso op 21-05-2006 17:19 ]


  • RammY
  • Registratie: Oktober 2001
  • Laatst online: 04-02 17:24

RammY

Dát!

als ik hm op een forum heb staan als ondertitel dan zal kan ik hm niet met een javascript aansturen.. het gaat echt puur om de inhoud en niet het plaatje opzich.

Met de refresh header wil het niet :) Dan krijg je beetje vage output. Dat had ik al geprobeerd ;)

Dus mag ik concluderen dat het niet wil?

Deze advertentieplaats is te huur!


  • Mafioso
  • Registratie: November 2000
  • Laatst online: 15-02 11:52
Dus mag ik concluderen dat het niet wil?
Juist :)

  • [BoSS]
  • Registratie: Maart 2000
  • Laatst online: 21-02 10:56

[BoSS]

Geen woorden maar daden!

RammY schreef op zondag 21 mei 2006 @ 17:19:
Met de refresh header wil het niet :) Dan krijg je beetje vage output. Dat had ik al geprobeerd ;)
Net even geprobeerd, met een refresh-header bovenaan mijn script gaat het bij mij gewoon goed. Internet Explorer en Firefox refreshen de pagina, alleen Safari reageert niet op de header.

Plaats dit bovenaan je script en het gaat zeker werken ;)
PHP:
1
header("Refresh: 30");

20x 170 Wp (Solar Frontier) op ZZO / 54 graden


Verwijderd

Topicstarter
Oke heb het nu zover dat hij elke keer 3 letters laat zien:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
function keygen() {
  $tempstring = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  for($length = 0; $length != 3; $length++) {
   $temp = str_shuffle($tempstring);
   $char = mt_rand(0, 3);
   $pass .= $temp[$char];
  }
  return $pass;
 }
 echo(keygen());
 ?>


Maar hoe krijg ik die nu gekoppeld met dat plaatje?

  • [BoSS]
  • Registratie: Maart 2000
  • Laatst online: 21-02 10:56

[BoSS]

Geen woorden maar daden!

Zet deze functie bovenaan je script (van de startpost) en vervang de laatste regel (met de echo) door:
PHP:
1
$text = keygen();

[ Voor 6% gewijzigd door [BoSS] op 21-05-2006 17:33 ]

20x 170 Wp (Solar Frontier) op ZZO / 54 graden


Verwijderd

Topicstarter
Oke bedankt het is gelukt (deel 1 dan) hij maakt nu elke keer een andere 3 letterige 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
<?php
   // Maak een PNG header
   header("Content-type: image/png");
   
   // Kopieer het plaatje van een reeds bestaand bestandje
   $plaatje = ImageCreateFromPNG("button.png");
   $zwart = ImageColorAllocate($plaatje, 333, 111, 255);
   
   // Zoek hoe breed en hoe hoog de tekst gaat worden
   if (!isset($text)) $text = keygen();
   $font = "verdanab.ttf";
   $box = ImageTTFBBox(16, 0, $font, $text);
   $hoogte  = $box[1] - $box[7];
   $breedte = $box[2] - $box[0];
   
   // Bereken de "default" coordinaten
   $x_coordinaat = $box[0];
   $y_coordinaat = $hoogte - $box[1];
   
   // Bereken nu de verschuiving die nodig is om de tekst de centreren
   $offset_x = (int)((ImageSX($plaatje) - $breedte) / 2);
   $offset_y = (int)((ImageSY($plaatje) - $hoogte) / 2) - 2;
   
   // Teken de tekst
   ImageTTFText($plaatje, 16, 0,
      $x_coordinaat + $offset_x,
      $y_coordinaat + $offset_y,
      $zwart, $font, $text);
   
   // Schrijf de ouput weg
   ImagePNG($plaatje);
   ImageDestroy($plaatje);
?>

<?
function keygen() {
  $tempstring = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  for($length = 0; $length != 3; $length++) {
   $temp = str_shuffle($tempstring);
   $char = mt_rand(0, 3);
   $pass .= $temp[$char];
  }
  return $pass;
 }
 ?>



alleen snap ik die chr niet kan dat in deze zelfde code?? hij moet dus controleren of de gebruiker dezelfde code intypt als er op het plaatje staat ...

[ Voor 36% gewijzigd door Verwijderd op 21-05-2006 17:48 ]


  • funkwurm
  • Registratie: December 2005
  • Laatst online: 22-02-2021
Je moet de $text die je krijgt in een session zetten zodat je op de volgende pagina weer in diezelfde session kan kijken en vergelijken.

Overigens gaat dit dus enkel en alleen over server-side technieken.

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

sandriekus1987: Helemaal bovenaan de topiclisting staat het volgende topic vermeld: Waar hoort mijn topic?

Als je die eerst had gelezen, was je er al achter dat je topic veel beter in Programming past. Normaliter verplaatsen we het topic naar het juiste subforum en gaat de discussie vrolijk verder. Nou heb ik me laten influisteren, dat mijn ballen persoonlijk worden geserveerd als bali pangang als ik dit topic verplaats.

Naast bovenstaande reden is er nog meer mis met je topic: in Programming verwacht men dat je zelf dingen programmeert en uitzoekt. Een script van internet afhalen is niet eens zo erg, maar wil je die uitbreiden dan verwachten we wel wat zelfinzet van de topicstarter. Waar heb je dus gezocht, wat voor pseudo-code had je in gedachte, hoe heb je dat vertaald naar echte code en waar ging het precies mis.

Mocht je van mening zijn dat je probleem, met behulp van bovenstaande tips, nog steeds niet is opgelost, dan mag je een nieuw topic aanmaken in Programming, mits je het volgende grondig doorleest en je topicstart daar ook aan voldoet: Welkom in Programming - FAQ en Beleid

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.

Pagina: 1

Dit topic is gesloten.