GD Vraag

Status
Niet open voor verdere reacties.

LarsL

Gebruiker
Lid geworden
19 sep 2008
Berichten
155
Hallo allemaal,
Ik ben bezig met een credits-systeem, deze werkt met biljetten maar deze biljetten moeten uitgeprint worden, als een soort nep-geld.
Nu wil ik een code op elk biljet zetten (een unieke code) die ook in de database komt zodat het onmogelijk is hem zomaar te kopieren, ik weet het database gedeelte wel te doen maar met GD Library ben ik niet erg bekend.
Ik heb een voorbeeldje gemaakt in photoshop van een biljet en 8 biljetten op een a4-tje (ik wil uiteindelijk graag 8 biljetten op een a4'tje genereren zodat ik die kan uitprinten in 1x).
Ik beschik over het font maar weet niet hoe ik nou die biljetten kan laten genereren met behulp van GD Library.
Ik wil zo'n biljet graag laten genereren met een random code en volgens de positites op het voorbeeld biljet, deze wil ik dan 8x zoals het tweede a4 voorbeeld laat zien genereren. Deze kan ik dan vervolgens uitprinten.
Ik wil ook graag kunnen invoeren via de get parameter ?biljet welke waarde een biljet krijgt, op het voorbeeld biljet staat 100 maar ik wil bijvoorbeeld via die get parameter ook 1000 of 500 op het biljet laten 'stampen'.
Ik zou echt niet weten hoe ik dit moet doen en hoop dat jullie het zouden weten.

Alvast bedankt,
Lars.

De voorbeelden:
1 biljet (voorbeeldcode en waarde voor posities):
2w5ksxk.png


Op a4 (x8):
2w20e3p.png
 
Een paar pointers:

Het plaatsen van strings in een bestaand plaatje:
http://nl3.php.net/manual/en/function.imagestring.php

Het kopieren van plaatjes:
http://nl3.php.net/manual/en/function.imagecopy.php

Een nieuw plaatje aanmaken:
http://nl3.php.net/manual/en/function.imagecreatetruecolor.php

Een bestaand plaatje openen:
http://nl3.php.net/manual/en/function.imagecreatefromjpeg.php

Een gemaakt plaatje opslaan:
http://nl3.php.net/manual/en/function.imagejpeg.php

Je opent eerst het enkele biljet. Vervolgens zoek je de code, en die plak je met de imagestring functie op de juiste locatie(s).
Als je dat gedaan hebt, maar je een nieuw plaatje op A4 formaat, en met imagecopy plak je het er zo vaak in als je wilt.

Daarna kun je het met imagejpeg opslaan in een bestand, of het gewoon rechtstreeks outputten naar de browser; die zal het dan als plaatje weergeven.

Succes ;) Als je nog ergens vast komt te zitten, laat dan even zien wat je al gedaan hebt.
 
Bedankt, ik ga het proberen hardstikke bedankt alvast, ik kan een tijdje niet reageren omdat ik het een beetje druk heb maar dat houd niet in dat ik hem gesmeerd ben ofzo hoor, moet ik hem op opgelost zetten? Of wachten tot alles is gelukt?

Hardstikke bedankt nogmaals. Ik ga m'n best doen.

Alvast een vraagje, met image copy krijg ik toch niet elke keer een random code op een nieuw biljet? (8x een biljet is dat elk biljet wel een nieuwe code heeft was ik vergeten te vermelden)
 
Laatst bewerkt:
Nee, als elk biljet een andere code nodig heeft, moet je het proces een paar keer herhalen.

Dus open basis plaatje, plak code en hoeveelheid erop, plak op de juiste plek in het grote vel, open opnieuw basis plaatje, herhaal.

En laat em maar open tot je klaar bent, denk ik? :) Het probleem is nog niet opgelost.
 
Ik heb een voorbeeldscript in elkaar gezet. Je geeft zelf aan dat je het database gedeelte zelf kunt doen, dus ik gebruik als voorbeeld random codes. Ook wil je een custom font gebruiken, dit zit ook verwerkt in mijn voorbeeld: http://kladblok.net/helpmij/coupon/.

Verder geef je aan met $_GET de credits-waarde te willen veranderen, dit is op zich geen probleem natuurlijk:
maar als je erg grote of erg lage getallen gebruikt heeft dat tot gevolg dat de tekst niet meer op de juiste positie komt (door gebruik van vaste coordinaten en een eigen font (er even vanuitgaande dat je geen monospaced font gebruikt)).

PHP:
<?php
    //gezien het doel van dit script, de optie om de source te laten zien
    if (isset($_GET["s"])) { highlight_file(__FILE__); die(); }

    header ("Content-type: image/png");
    function random_code() {
        srand();
        $ok = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
        $token = "";
        for($i = 0; $i < 6; $i ++) { $token .= $ok[rand(0, strlen($ok))]; }    
        return $token;
    }
    //Hoogte en breedte van de afbeelding (A4 heeft verhouding van 297*210)
    $canvas_x = 1200;
    $canvas_y = round(($canvas_x*297)/210);
    $handle = ImageCreate ($canvas_x, $canvas_y) or die ("Kan geen afbeelding maken, is GD geinstalleerd?");
    //Kleuren instellen
    $coupon = ImageColorAllocate ($handle, 200,150,100);
    $werkruimte = ImageColorAllocate ($handle, 225,225,225);
    $zwart = imagecolorallocate($handle, 0, 0, 0);
    //Achtergrond werkruimte
    imagefilledrectangle ( $handle, 0, 0, $canvas_x, $canvas_y, $werkruimte );
    //Marge en hoogte*breedte verhoudingen per vlak
    $m=40;
    $b=floor(($canvas_x-(4*$m))/2);
    $h=floor(($canvas_y-(8*$m))/4);
    //8 keer de omtrek van een coupon tekenen
    for($i = 1; $i < 5; $i ++) {
        imagefilledrectangle ( $handle, $m, ($m*((2*$i)-1))+($i-1)*$h, $m+$b,($m*((2*$i)-1))+($i*$h), $coupon );
        imagefilledrectangle ( $handle, ($m*3)+$b, ($m*((2*$i)-1))+($i-1)*$h, ($m*3)+(2*$b), ($m*((2*$i)-1))+($i*$h), $coupon );    
    }
    //imagefontheight() en width() werken niet voor truetype fonts, dus locaties handmatig
    //goedzetten. Totale lengte afbeelding (=$canvas_x) aanpassen zal tot gevolg hebben dat
    //tekst vanuit onderstaande loops niet meer op de juiste posities zullen uitkomen.
    $font = dirname(__FILE__)."/MORPHEUS.ttf";
    if (isset($_GET["credit"]) && preg_match("/^\d+$/", $_GET["credit"])) { $credit = $_GET["credit"]; } else { $credit=100; }
    for($i = 0; $i < 4; $i ++) {
        imagettftext($handle, 50, 0, ($b/5)+$m, ($h/2)+$m+($i*$h)+(($i*2)*$m), $zwart, $font, $credit." credits");
        imagettftext($handle, 50, 0, ($b+(3*$m))+($b/5), ($h/2)+$m+($i*$h)+(($i*2)*$m), $zwart, $font, $credit." credits");
    }
    for($i = 0; $i < 4; $i ++) {
        imagettftext($handle, 25, 0, ($b/2.8)+$m, ($h/4)+$m+($i*$h)+(($i*2)*$m), $zwart, $font, "R-credits");
        imagettftext($handle, 25, 0, ($b+(3*$m))+($b/2.8), ($h/4)+$m+($i*$h)+(($i*2)*$m), $zwart, $font, "R-credits");
    }
    for($i = 0; $i < 4; $i ++) {
        $code = random_code();
        imagettftext($handle, 25, 0, ($b/10)+$m, ($h/1.3)+$m+($i*$h)+(($i*2)*$m), $zwart, $font, $code);
        imagettftext($handle, 25, 0, ($b/1.5)+$m, ($h/1.3)+$m+($i*$h)+(($i*2)*$m), $zwart, $font, $code);
        $code = random_code();
        imagettftext($handle, 25, 0, ($b+(3*$m))+($b/10), ($h/1.3)+$m+($i*$h)+(($i*2)*$m), $zwart, $font, $code);
        imagettftext($handle, 25, 0, ($b+(3*$m))+($b/1.5), ($h/1.3)+$m+($i*$h)+(($i*2)*$m), $zwart, $font, $code);
    }
    ImagePng ($handle);
?>
(dit forum maakt een blok om de php code, als alternatief kun je de code hier bekijken: /coupon/?s=x).

Het uiterlijk van het geheel, de link met een database en eventuele extra beveiliging zul je zelf moeten maken, maar ik denk dat ik je een duw in de juiste richting heb gegeven.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan