Tutorials
De GD bibliotheek: foto's bewerken
Met php kun je ook foto's bewerken.
Pagina 1
Imagefun
Toen ik zelf op zoek was naar een tutorial over het bewerken van foto’s, kwam ik deze tutorial over beeldbewerken tegen: http://www.phpied.com/image-fun/. De basisklasse die daar wordt gebruikt, gebruik ik in deze tutorial ook.
De klasse die ik gebruik, is voor PHP 5. Dus als je alleen maar PHP 4 tot je beschikking hebt, zul je even de klasse van phpied moeten kopiëren.
Naast deze klasse, gebruik ik functies, die gebruik maken van de klasse.
De klasse die ik gebruik, is voor PHP 5. Dus als je alleen maar PHP 4 tot je beschikking hebt, zul je even de klasse van phpied moeten kopiëren.
<?php
class pixel {
public $r;
public $g;
public $b;
public function __construct($r, $g, $b) {
$this->r = ($r > 255) ? 255 : (($r < 0) ? 0 : (int)($r));
$this->g = ($g > 255) ? 255 : (($g < 0) ? 0 : (int)($g));
$this->b = ($b > 255) ? 255 : (($b < 0) ? 0 : (int)($b));
}
}
?>
Naast deze klasse, gebruik ik functies, die gebruik maken van de klasse.
Pagina 2
RGB: Rood Groen Blauw
Bij het manipuleren van foto’s, ben je voor een groot deel bezig met kleuren. Bij bijna iedere bewerking wordt er wel een kleur veranderd. Je zult dus goed moeten weten, hoe je met die kleuren kunt rekenen. Hoe je een kleur zo kunt berekenen dat hij de kleur krijgt die je wenst de hebben.
Om bijvoorbeeld een foto van kleur naar pure zwart-wit te veranderen (dus of zwart, of wit, geen grijswaarden), gebruik je een berekening die kijkt of de opgetelde waarden dichter bij wit liggen of dichter bij zwart liggen.
Ik vertel je dat wit de RGB waarde 255, 255, 255 heeft en zwart de waarde 0, 0, 0. Een berekening naar pure zwart wit zo dan voor de RGB kleur 80, 10, 4 ongeveer zo zijn:
Opzich is er niets spectaculairs aan dit scriptje. Het bewerkt geen afbeelding…
Om bijvoorbeeld een foto van kleur naar pure zwart-wit te veranderen (dus of zwart, of wit, geen grijswaarden), gebruik je een berekening die kijkt of de opgetelde waarden dichter bij wit liggen of dichter bij zwart liggen.
Ik vertel je dat wit de RGB waarde 255, 255, 255 heeft en zwart de waarde 0, 0, 0. Een berekening naar pure zwart wit zo dan voor de RGB kleur 80, 10, 4 ongeveer zo zijn:
<?php
$wit = (255 + 255 + 255);
$zwart = 0;
// Om te controleren of de waarde dichter bij wit dan bij zwart ligt, contoleer ik of hij ónder de helft van wit (255 + 255 + 255) ligt, of erboven.
$helft = ($wit / 2);
// Dan nu de waarde (handmatig)
$waarde = (80 + 10 + 4);
if ($waarde > $helft) {
// Het is hoger dan de helft, het dichst bij wit dus
echo “De waarde wordt wit”;
}
else {
// Het is lager dan de helft, het dichst bij zwart dus
echo “De waarde wordt zwart”;
}
unset($wit, $zwart, $helft, $waarde);
?>
Opzich is er niets spectaculairs aan dit scriptje. Het bewerkt geen afbeelding…
Pagina 3
Een afbeelding openen
Nu, als je deel 1 hebt gelezen, weet je hoe je een lege afbeelding maakt. Als je dat niet (meer) weet, raad ik je aan het (nogmaals) te lezen.
Bij het manipuleren van foto’s maak je geen nieuwe afbeelding aan, maar open je de afbeelding. Niet met fopen, maar met imagecreatefromjpeg bijvoorbeeld. Ook hier geldt weer dat je gifjes, png’s en bmp’s kunt openen.
resource imagecreatefromjpeg ( string filename )
Ook zijn er nog wat andere manieren om een afbeelding te openen, maar daar ga ik deze tutorial niet op in.
Bij het manipuleren van foto’s maak je geen nieuwe afbeelding aan, maar open je de afbeelding. Niet met fopen, maar met imagecreatefromjpeg bijvoorbeeld. Ook hier geldt weer dat je gifjes, png’s en bmp’s kunt openen.
resource imagecreatefromjpeg ( string filename )
Ook zijn er nog wat andere manieren om een afbeelding te openen, maar daar ga ik deze tutorial niet op in.
<?php
$afbeelding = imagecreatefromjpeg(‘schets.jpg’);
?>
Pagina 4
Pixel voor pixel
Als je een hele afbeelding wilt bewerken, zul je iedere pixel één voor één moeten bewerken. Je zult door de hele afbeelding moeten lopen. Je zult iedere pixel moeten afgaan. Gelukkig kan dat heel makkelijk met twee for-loopjes.
Op deze manier wordt iedere pixel in je afbeelding afgegaan.
<?php
for($x = 0; $x < imagesx($afbeelding); $x++) {
for ($y = 0; $y < imagesy($afbeelding); $y++) {
// Dan komt hier de bewerking voor de ‘actuele’ pixel
}
}
?>
Op deze manier wordt iedere pixel in je afbeelding afgegaan.
Pagina 5
Kleurwaarde en veranderen
Het handigste is om je bewerkingen in een functie te stoppen. In het vorige hoofdstuk heb je kunnen zien hoe je elke pixel één voor één afgaat. Op de plek waar stond:
… zet je dan gewoon je functie + parameters neer en ben je klaar.
Nu ga ik een functie maken, die met de berekeningen van hoofdstuk 2 een afbeelding omzet van kleur naar pure zwart-wit. Ik gebruik daarbij de expressie imagecolorsforindex. Deze expressie lust 2 parameters. De eerste is de afbeelding en de tweede een variabele die je heb gemaakt met de expressie imagecolorat.
array imagecolorsforindex ( resource image, int index )
Let wel op, je moet eerst met de expressie imagecolorat een variabele maken die je als parameter kunt opgeven bij imagecolorsforindex.
int imagecolorat ( resource image, int x, int y )
Dat is wel leuk, nu weet je de kleur van de pixel. Maar je wilt hem veranderen,
toch? Dat doen we met de expressie imagesetpixel. Ook deze expressie lust 4 parameters, en dat zijn dezelfde als imagecolorsforindex. Alleen de vierde is de kleur.
bool imagesetpixel ( resource image, int x, int y, int color )
Zo, nu ben je klaar om een afbeelding om te zetten van kleur naar pure zwart-wit. Ik zal het even voordoen. Eerst maak ik een functie, dan open ik een afbeelding, dan de twee for-loopjes en dan? Dan ga ik de foto opslaan. Op een andere manier dan dat je de afbeelding laat zien.


Je hebt bij deze bewerking de pixel klasse niet nodig. Je zou hem wel kunne gebruiken, maar daar heb ik even niet aan gedacht :c) Je hebt er nu dus gewoon een mooie klasse bij :D
// Dan komt hier de bewerking voor de ‘actuele’ pixel… zet je dan gewoon je functie + parameters neer en ben je klaar.
Nu ga ik een functie maken, die met de berekeningen van hoofdstuk 2 een afbeelding omzet van kleur naar pure zwart-wit. Ik gebruik daarbij de expressie imagecolorsforindex. Deze expressie lust 2 parameters. De eerste is de afbeelding en de tweede een variabele die je heb gemaakt met de expressie imagecolorat.
array imagecolorsforindex ( resource image, int index )
Let wel op, je moet eerst met de expressie imagecolorat een variabele maken die je als parameter kunt opgeven bij imagecolorsforindex.
int imagecolorat ( resource image, int x, int y )
Dat is wel leuk, nu weet je de kleur van de pixel. Maar je wilt hem veranderen,
toch? Dat doen we met de expressie imagesetpixel. Ook deze expressie lust 4 parameters, en dat zijn dezelfde als imagecolorsforindex. Alleen de vierde is de kleur.
bool imagesetpixel ( resource image, int x, int y, int color )
Zo, nu ben je klaar om een afbeelding om te zetten van kleur naar pure zwart-wit. Ik zal het even voordoen. Eerst maak ik een functie, dan open ik een afbeelding, dan de twee for-loopjes en dan? Dan ga ik de foto opslaan. Op een andere manier dan dat je de afbeelding laat zien.

<?php
require_once('./gd.class.pixel.php');
function zwartwit($afbeelding, $x, $y) {
$kleur = imagecolorsforindex($afbeelding, imagecolorat($afbeelding, $x, $y));
$wit = (255 + 255 + 255);
$zwart = 0;
$helft = ($wit / 2);
$waarde = $kleur['red'] + $kleur['green'] + $kleur['red'];
if ($waarde > $helft) {
$wittekleur = imagecolorallocate($afbeelding, 255, 255, 255);
imagesetpixel($afbeelding, $x, $y, $wittekleur);
}
else {
$zwartekleur = imagecolorallocate($afbeelding, 0, 0, 0);
imagesetpixel($afbeelding, $x, $y, $zwartekleur);
}
}
$afbeelding = imagecreatefromjpeg('schets.jpg');
for($x = 0; $x < imagesx($afbeelding); $x++) {
for ($y = 0; $y < imagesy($afbeelding); $y++) {
zwartwit($afbeelding, $x, $y);
}
}
header('Content-type: image/png');
imagepng($afbeelding);
imagedestroy();
?>

Je hebt bij deze bewerking de pixel klasse niet nodig. Je zou hem wel kunne gebruiken, maar daar heb ik even niet aan gedacht :c) Je hebt er nu dus gewoon een mooie klasse bij :D
Reacties
0