login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
CDNC
Moeilijkheidsgraad:
Normaal
Hits:
6332
Punten:
Aantal punten:
 (4.88)
Aantal stemmen:
8
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (10)
 

Tutorial:

Gd Library Deel 4

1. Voorwoord
2. Cirkels
3. Verticale tekst
4. Eigen functies
5. Bewerkte afbeelding opslaan
6. Slotje


1. Voorwoord
Deze tutorial is een vervolg op:
- Gd Library Deel 1
- Gd Library Deel 2
- Gd Library Deel 3
Lees deze 3 tutorials grondig door of fris de functies nog eens op. Ik ga niets herhalen, enkel nieuwe functies uitleggen, gebruiken en er voorbeelden van tonen.

top Top

2. Cirkels
Ik denk niet dat dit zo veel gebruikt zal worden maar het zou misschien handig kunnen zijn voor wiskundige functies, hierbij denk ik aan sinus, cosinus en tangens.
Met deze cirkels ga ik ook nog enkele andere functies nader verklaren.

Een gewone cirkel teken je met de functie ImageArc();. Zoals gebruikelijk start ik met een voorbeeld code.
<?

    header
('content-type: image/png');
    
    
$img = imagecreate(150, 150);    
    
$grijs = imagecolorallocate($img, 200, 200, 200);
    
$zwart = imagecolorallocate($img, 0, 0, 0);
      
    
ImageArc($img, 50, 100, 125, 125, 0, 0, $zwart);    
    
    
imagepng($img);
    
imagedestroy($img);

?>
Het resultaat hiervan:

Verklaar van de functie:
Parameter Functie
$img Afbeedling
50 x-coördinaat van het middelpunt van de cirkel
100 y-coördinaat van het middelpunt van de cirkel
125 Breedte cirkel [later meer]
125 Hoogte cirkel [later meer]
0 Deel van de cirkel verbergen tov postieve x-as, richting = wijzerszin, in graden
0 Deel van de cirkel tonen tov postieve x-as, richting = wijzerszin, in graden (0 = 360 = volledige cirkel tonen)
$zwart Kleur van de cirkel
Uit parameter 4 & 5 blijkt dat je met deze functie niet alleen cirkel meer ook ovalen enz. kunt tekenen.
Ik ga enkele voorbeelden laten zien die je ook kan tekenen, enkel parameter 4 & 5 gaan veranderen.
<?

    header
('content-type: image/png');
    
    
$img = imagecreate(124, 124);    
    
$grijs = imagecolorallocate($img, 200, 200, 200);
    
$zwart = imagecolorallocate($img, 0, 0, 0);
      
    
imagearc($img, 65, 65, [veranderlijk], [veranderlijk], 0, 0, $zwart);    
    
    
imagepng($img);
    
imagedestroy($img);

?>

Aan de voorbeelden hiernaast denk ik dat het wel duidelijk is waarvoor deze 2 parameters dienen.
Parameter 4 Parameter 5 Voorbeeld
50 100
100 100
100 50

Nu ga ik met parameter 6 & 7 spelen:
<?

    header
('content-type: image/png');
    
    
$img = imagecreate(124, 124);    
    
$grijs = imagecolorallocate($img, 200, 200, 200);
    
$zwart = imagecolorallocate($img, 0, 0, 0);
      
    
imagearc($img, 65, 65, 100, 100, [veranderlijk], [veranderlijk], $zwart);    
    
    
imagepng($img);
    
imagedestroy($img);

?>
Parameter 6 Parameter 7 Voorbeeld
90 0
P7 = 0 => volledige cirkel tonen,
P6 = 90 => 90° verbergen
90 90
P7 & P6 heffen elkaar op
0 90
P7 = 90 => 90° tonen,
P6 = 0 => 0° verbergen
180 0
P7 = 0 => Volledige cirkel tonen,
P6 = 180 => 180° verbergen
360 0
P7 = 0 => Volledige cirkel tonen,
P6 = 360 = 0 => 0° verbergen

Je kan ook een volledig opgevulde cirkel laten tekenen. Hier hebben we de functie ImageFilledEllipse();. Deze functie zogoed als hetzelfde als ImageArc() maar deze is altijd een volledige cirkel, en heeft dus 2 parameters minder.
Klein voorbeeldje dan maar:
<?

    header
('content-type: image/png');
    
    
$img = imagecreate(125, 125);    
    
$grijs = imagecolorallocate($img, 200, 200, 200);
    
$zwart = imagecolorallocate($img, 0, 0, 0);
      
    
imagefilledellipse($img, 62, 62, 100, 100, $zwart);    
    
    
imagepng($img);
    
imagedestroy($img);

?>
Dat maakt:


Maar aan de hand van cirkels wil ik ook nog een andere functies uitleggen nl: ImageColorAllocateAlpha(), ImageCreateTrueColor(), ImageFill(), ImageColorAt() en ImageSetPixel()
ImageColorAllocateAlpha() crieert zoals ImageColorAllocate() een kleur binnen een afbeelding maar deze functie maakt de kleur tot een doorzichtige kleur, voorbeeldje dan maar:
<?

    header
('content-type: image/png');
    
    
$img = ImageCreateTrueColor(375, 200);
        
    
$bg = imagecolorallocate($img, 225, 225, 225);
    
    
$grijs = ImageFill($img, 0, 0, $bg);
    
    
$blauw = ImageColorAllocateAlpha($img, 0, 64, 128, 75);
    
$oranje= ImageColorAllocateAlpha($img, 255, 128, 64, 50);
    
$paars = ImageColorAllocateAlpha($img, 128, 0, 125, 0);
    
$groen = ImageColorAllocateAlpha($img, 0, 128, 128, 100);
    
$rood  = ImageColorAllocateAlpha($img, 128, 0, 0, 50);
    
$wit   = ImageColorAllocateAlpha($img, 255, 255, 255, 50);
    
$zwart = ImageColorAllocateAlpha($img, 0, 0, 0, 125);
    
    
ImageFilledEllipse($img, 75, 75, 100, 100, $blauw);    
    
ImageFilledEllipse($img, 150, 100, 100, 100, $oranje);    
    
ImageFilledEllipse($img, 225, 125, 100, 100, $paars);    
    
ImageFilledEllipse($img, 300, 115, 100, 100, $groen);    
    
ImageFilledEllipse($img, 115, 50, 100, 100, $rood);    
    
ImageFilledEllipse($img, 250, 75, 100, 100, $wit);
    
ImageFilledEllipse($img, 325, 75, 100, 100, $zwart);
    
    
imagepng($img);
    
imagedestroy($img);

?>     
Resultaat:

Functie naam Uitleg
ImageCreateTrueColor() Maakt een nieuwe lege afbeelding,
Parm1: x-afmeting
Parm2: y-afmeting
ImageFill() Kleur de achtergrond van de afbeelding,
Parm1: afbeelding
Parm2: x-start
Parm3: y-start
Parm4: kleur
ImageColorAllocateAlpha() Maakt een doorzichtige kleur aan,
Parm1: afbeelding
Parm2: r-waarde
Parm3: g-waarde
Parm4: b-waarde
Parm5: opacity (waarde tussen 0 en 127, waarbij 0 niets doorzichtig is, en 127 het volledige onderliggende kleur zichtbaar is)
Nu nog 2 andere functies te gebruiken: ImageColorAt() en ImageSetPixel()
Functie naam Uitleg
ImageColorAt() Returnt de kleur van een bepaalde pixel,
Parm1: afbeelding
Parm2: x-coördinaat van het punt
Parm3: y-coördinaat van het punt
ImageSetPixel() Kleurt 1 pixel naar de opgevens RGB-waarde
Parm1: afbeelding
Parm2: x-coördinaat van het punt
Parm3: y-coördinaat van het punt
Parm4: kleur
Voor deze 2 functies ga ik geen voorbeeld geven, want deze worden gebruikt bij: Zwart/wit (grijstinten) en Negatief, mij lijkt het vrij duidelijk wat deze functies doen.

top Top
3. Verticale tekst
Hiervoor is er een functie, maar deze kan enkel 1 lettertje zetten, de functie is: ImageCharUp()
Voorbeeldje:
<?    
    
    $im
= imagecreate(20, 40);

    
$string = 'Hij zal enkel de eerst erop zetten';
    
    
$bg = imagecolorallocate($im, 225, 225, 225);
    
$zwart = imagecolorallocate($im, 0, 0, 0);
    
    
ImageCharUp($im, 3, 1, 20, $string, $zwart);
    
    
header('Content-type: image/png');
    
imagepng($im);

?>
Resultaat:

Enkel de 'H' van 'hij' staat er, dus als we meerde dingen erop willen zetten, ga we zelf iets moeten verzinnen.
Eerste zullen we dus de string moeten opsplitsen tot een array waarbij enkele key 1 letterje van de string bevat, deze array kunnen we dan weer uitlezen en de lettertje per letterje op de afbeelding plaatsen.
Ik maak heb je nu even heel gemakkelijk:
<?    
    
    $im
= imagecreate(20, 300);
    
$string = 'Hij zal enkel de eerst erop zetten';    
    
$bg = imagecolorallocate($im, 225, 225, 225);
    
$zwart = imagecolorallocate($im, 0, 0, 0);
    
    
VerticaleText($im, 3, 1, 20, $string, $zwart, true);
    
    
header('Content-type: image/png');
    
imagepng($im);
    
    
// nu dan de functie
    
function VerticaleText($img, $size, $pos_x, $pos_y, $text, $color, $start = true)
    {
        
$tekes = array();
        
$aantal = strlen($text);
        
// spilts de sting op
        
for($i=0; $i<$aantal; $i++)
        {
            
$tekes[] = substr($text, $i, 1);
        }
        
        function
afmSize($size)
        {
          
$x = array(1 => 5,6,7,8,9);
          
$y = array(1 => 6,8,9,10,10);
          return array(
'x' => $x[$size], 'y' => $y[$size]);
        }        
        
$lSize = afmSize($size);
        
        
// ff een luxe functe erbij, als $start == true dan is de Y-coordinaat ($pos_y) het eindpunt van de sting op de afbeelding,
        //                                      als $start == false dan is de Y-coordinaat ($pos_y) het beginpunt van de sting op de afbeelding,
        
$start = ($start == true) ? $aantal * $lSize['x'] + $pos_y : $pos_y ;
        
        
// loop de array af, en zet ze op de afbeelding
        
foreach($tekes as $k => $v)
        {            
            
ImageCharUp($img, $size, $pos_x, $start - $k * $lSize['x'], $v, $color);
        }        
    }
    
?>
Dat is dus de functie: en als we dit uitvoeren krijgen we als resultaat:



top Top

4. Eigen functies
Bij het vorige stukje hebben we ook al een eigen fucntie gebazeert op een originele functie.
Nu gaan we dus enkele kleine functies maken.

top Top

4. Eigen functies » 1. Zwart/wit (grijstinten)
Hier gaan we dus pixel per pixel moeten herleiden naar een grijstint, de breedte van de afbeedling kunnen we vinden door de functie Imagesx(), En de hoogte door de functie Imagesy(),
Om dus alle pixels af te lopen hebben we dus 2 for-loops nodig.
<?

    
function imgGrijs($img)
    {
        for(
$i=1; $i<imagesx($img); $i++)
        {
            for(
$j=1; $j<imagesy($img); $j++)
            {
                
//
            
}
        }
    }
    
?>
voor de grijstint te bepalen (grijstint: De r-waarde = g-waarde = b-waarde).
Maar eerst moeten we de RGB-waarde van die ene pixel hebben, dit doen we met de functie ImageColorAt() als we die hebben neemen we het gemiddelde van de R, de G en de B waar en we kleuren de nieuwe pixel met de functie ImageSetPixel()
<?

    
function imgGrijs($img)
    {
        for(
$i=1; $i<imagesx($img); $i++)
        {
            for(
$j=1; $j<imagesy($img); $j++)
            {
                
// kleur zoeken
                
$rgb = ImageColorAt($img, $i, $j);
                
// elke waarde appart
                
$r = ($rgb >> 16) & 0xFF;
                
$g = ($rgb >> 8) & 0xFF;
                
$b = $rgb & 0xFF;
                
// gemiddelde
                
$n = ($r + $g + $b)/3;
                
// nieuwe kleur maken
                
$color = imagecolorallocate($img, $n, $n, $n);
                
// de pixel de nieuwe kleur geven
                
imagesetpixel($img, $i, $j, $color);
            }
        }
    }
    
?>
Ken je ons aapje nog van de vorige tutorial? Hier is hij, we gaan hem in grijstinten zetten om te tonen dat mijn functie wel degelijk werkt.

Dat lijkt mij goed omgezet naar grijstinten

top Top

4. Eigen functies » 2. Negatief
Hier hebben we dezelfde 2 functies nodig als in het vorige, nl: ImageColorAt() en ImageSetPixel(). Ook hier moeten we weer pixel per pixel bekijken, dus:
<?    
    
    
function imgNegatief($img)
    {
        for(
$i=1; $i<imagesx($img); $i++)
        {
            for(
$j=1; $j<imagesy($img); $j++)
            {
                
// kleur zoeken
                
$rgb = ImageColorAt($img, $i, $j);
                
// elke waarde appart
                
$r = ($rgb >> 16) & 0xFF;
                
$g = ($rgb >> 8) & 0xFF;
                
$b = $rgb & 0xFF;
                
                
//
            
}
        }
    }
    
?>
Het negatief, is het tegenovergestelde van de huidige kleur,
het tegengestelde van zwart is wit,
RGB-waarde van zwart: 0, 0, 0
RGB-waarde van wit: 255, 255, 255
Hun som is 255.

De tegenovergestelde kleur van die gebruikt is in de afbeelding is dus 255 - [waarde].
in code vorm wordt het:
<?    
    
    
function imgNegatief($im)
    {
        for(
$i=1; $i<imagesx($im); $i++)
        {
            for(
$j=1; $j<imagesy($im); $j++)
            {
                
// kleur zoeken
                
$rgb = ImageColorAt($im, $i, $j);
                
// elk apart    
                
$r = ($rgb >> 16) & 0xFF;
                
$g = ($rgb >> 8) & 0xFF;
                
$b = $rgb & 0xFF;
                
// kleur
                
$color = imagecolorallocate($im, 255-$r, 255-$g, 255-$b);
                
// inkleuren
                
imagesetpixel($im, $i, $j, $color);
            }
        }
    }
    
?>
Om het te bewijzen grijp ik weer naar mijn aapje:



top Top

4. Eigen functies » 3. Imageresize'ing
Nu zijn we bij de, denk ik, meetste nuttige functie. Het resizen van images!
Ik ga dus op zoek naar een functie, die, als de afbeeldings te groot is, deze gaat verkleinen. Zowel de breedte, als de hoogte!.
Ik ga dus beginnen met een functie te maken met 3 parameters, de afbeelding, de maximum breedte en de maximum hoogte
<?

    
function imgResize($im, $max_x, $max_y)
    {
            
    }
        
?>
Om al mee te weten of we moeten gaan verkleinen, gaan we de afmetingen van de afbeelding vergelijken met de maximum afmetingen.
En met het oog, indien nodig te verkleinen, ga ik de verhouding bereken van de maximums met de afmetingen van de afbeelding.
<?

    
function imgResize($im, $max_x, $max_y)
    {
        
// bekijk verhoudingen
        
$x_verhouding = imagesx($im) / $max_x;
        
$y_verhouding = imagesy($im) / $max_y;
        
    }

?>
Al de verhouding meer dan 1 is, is de afbeelding te groot en moet ze verkleint worden. Maar als de breedte en de hoogte het maximum overschrijden, moeten ze bijna aangepakt worden. Voor het vermijden van dubbelchecks ga ik kijken welk, breedte of hoofte, de grootste verhouding heeft. Met deze verhouden werken we dan verder. Dan kan de andere afmeting niet meer te groot zijn.
<?

    
function imgResize($im, $max_x, $max_y)
    {
        
// bekijk verhoudingen
        
$x_verhouding = imagesx($im) / $max_x;
        
$y_verhouding = imagesy($im) / $max_y;
        
        
// moeten we gaan resiz'en?
        
if($x_verhouding > 1 || $y_verhouding > 1)
        {
            
// als verder gaan op de grootste verhouding, wete we zeker dat de andere maat ook ok is!
            
if($x_verhouding > $y_verhouding)
            {
                
            }            
        }
    }

?>
Als de $x_verhouding het grootste is, word de nieuwe breedte, de maximum opgegeven breedte ($max_x). De nieuwe hoogte moet dezelfde verhouding hebben als de nieuwe breedte, dus delen we oude hoogte door de verhouding van de breedte.
Als de $y_verhouding het grootste is, doen we net hetzelfde maar omgekeert, x word y en y word x.
<?

    
function imgResize($im, $max_x, $max_y)
    {
        
// bekijk verhoudingen
        
$x_verhouding = imagesx($im) / $max_x;
        
$y_verhouding = imagesy($im) / $max_y;
        
        
// moeten we gaan resiz'en?
        
if($x_verhouding > 1 || $y_verhouding > 1)
        {
            
// als verder gaan op de grootste verhouding, wete we zeker dat de andere maat ook ok is!
            
if($x_verhouding > $y_verhouding)
            {
                
// voor de afbeedling zo groot mogelijk te houde
                
$nx = $max_x;
                
// we verkleinen zodat de verhouding blijft!
                
$ny = imagesy($im) / $x_verhouding;
            }
            else
            {
                
$ny = $max_y;
                
$nx = imagesx($im) / $y_verhouding;
            }
        }
    }

?>
We hebben nu alles wat we moeten hebben voor het maken van de nieuwe afbeelding. Dus maken we een nieuwe afbeelding $nIm, met de breedte $nx en de hoogte $ny. We geven het een witte achtergrond (blijft toch niets van over). En dan zetten we er de ouder afbeelding op met de nieuwe breedte en hoogte.
Dan nog enkel de return van de functie, want we gaan de afbeelding niet aan maken binnen de functie. Dan kan er nog alles gedaan worden met de nieuwe afbeelding, zoals watermerken enz.
<?

    
function imgResize($im, $max_x, $max_y)
    {
        
// bekijk verhoudingen
        
$x_verhouding = imagesx($im) / $max_x;
        
$y_verhouding = imagesy($im) / $max_y;
        
        if(
$x_verhouding > 1 || $y_verhouding > 1)
        {
            
// als verder gaan op de grootste verhouding, wete we zeker dat de andere maat ook ok is!
            
if($x_verhouding > $y_verhouding)
            {
                
// voor de afbeedling zo groot mogelijk te houde
                
$nx = $max_x;
                
// we verkleinen zodat de verhouding blijft!
                
$ny = imagesy($im) / $x_verhouding;
            }
            else
            {
                
$ny = $max_y;
                
$nx = imagesx($im) / $y_verhouding;
            }
            
$nIm = imagecreatetruecolor($nx, $ny);
            
imagefill($nIm,0,0,imagecolorallocate($nIm,0,0,0));
            
imagecopyresampled($nIm, $im, 0, 0, 0, 0, $nx, $ny, imagesx($im), imagesy($im));
            
            
$im = $nIm;
        }
        
        return
$im;
    }

?>
Nu we onze functie hebben, wat dacht je van ons aapje verkleinen?
<?    
        
    $aap
= imagecreatefrompng('vb-pic.png');
    
    
$img = imgResize($aap,100,100);        
    
    
imagepng($img);
    
imagedestroy($img);        

?>
Resultaat:

Het blijkt dat ons aapje breder was dandat hij hoog is, zijn breedte is dan ook 100 pixels!

top Top

5. Bewerkte afbeeldingen opslaan
Na het verkleinen of watermerken of het weet ik veel-len van een afbeelding is het misschien leuk deze ook werkelijk op te slaan zodat php niet telkens opnieuw de afbeelding moet genereren. Dit doen we met de functie imagePNG() indien het .PNG moet zijn, anders kan het ook zijn: imageGIF() en imageJPEG().

Deze functies hebben 2 optionele parameters, de naam waaronder het moet worden opgeslagen, en de kwaliteit ervan.
We hebben nu ons aapje klein gemaakt, nu gaan we hem opslaan onder de naam 'aap_klein.png'.
<?
        
    $aap
= imagecreatefrompng('../gd3/vb-pic.png');
    
    
$img = imgResize($aap,100,100);        
    
    
imagepng($img, 'aap_klein.png');
    
imagedestroy($img);        

?>
Nu zal 'aap_klein.png' de verkleinde versie zijn die ook effectief opgeslagen is. Je kan ook een derde parameter meegeven, de qualiteit van de afbeelding. Maar die hoeft ook niet.

Opmerking: Als de afbeelding al bestaat zal hij wel een error generen.

top Top

6. Slotje
Als je stemt, wil ik ook dat je een reactie achterlaat voor tips voor eventuele volgende tutorials.

Als je wil:
  • Download hier alle bestanden die ik gebruikt heb
  • Download hier een class met alle functies uit deze tutorial (uitleg staat onderaan)


top Top




« Vorige tutorial : Gd Library Deel 3 Volgende tutorial : MVC pattern uitgelegd »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.016s