Hallo,

Ik ben een webshop aan het maken. Ik wil dat de beheerder een afbeelding kan kiezen en dat deze geuploaded wordt. Maar in het design gebruik ik overal vierkanten met een witte achtergrond.

Alle afbeeldingen die geuploaded worden hebben al een witte achtergrond, maar zijn JPG-formaat. Bijvoorbeeld de afmetingen zijn 200x100 pixels. Dan wil ik dat hij links en rechts 50px witruimte toevoegt, zodat de afbeelding 200x200px is.

Heeft iemand een manier om dit te doen?

Bedankt!
Jeroen
Hallo Jan, Bedankt voor je antwoord! Ik ben nog niet bij dat systeem, maar met deze info moet het zometeen wel lukken! Nogmaals bedankt!
Advies is om de images te cachen zodat de bewerkingen niet elke keer gedaan hoeven te worden. Ik kwam uit op zoiets:

<?php

function cacheImage($srcFile, $targetDir, $width, $height)
{
    // Laad orignele afbeelding van uit het bestand en maak er een truecolor afbeelding van
    $src = imagecreatefromjpeg($srcFile);
    imagepalettetotruecolor($src); 

    // Voor het resultaat maken we een nieuwe afbeelding aan in het geheugen
    $dest = imagecreatetruecolor($width, $height);

    // vul de achtergrond op met een witte kleur
    $white = imagecolorallocate($src, 255, 255, 255);
    imagefill($dest, 0, 0, $white);

    // bepaal de verhouding tussen breedte en hoogte 
    $r = imagesx($src) / imagesy($src);

    // maak een onderscheid tussen landscape en portret afbeeldingen
    if(imagesx($src) > imagesy($src)) {
        // landscape
        $w = $width;
        $h = $height / $r;
        // plak de afbeelding op de juiste positie en in de juiste afmetingen in de nieuwe afbeelding
        imagecopyresampled($dest, $src, 0, ($height-$h)/2, 0, 0, $w, $h, imagesx($src), imagesy($src));
    } else {
        // portret
        $w = $width * $r;
        $h = $height;
        // plak de afbeelding op de juiste positie en in de juiste afmetingen in de nieuwe afbeelding
        imagecopyresampled($dest, $src, ($width-$w)/2, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
    }

    // indien de cache directory niet bestaat maak hem aan
    @mkdir($targetDir, 0777, true);

    // Sla de nieuwe afbeelding op.
    imagejpeg($dest, $targetDir . '/' . $srcFile);

    // even netjes het geheugen vrij maken
    imagedestroy($dest);
    imagedestroy($src);
}

cacheImage('original.jpg', 'cache/shop', 200, 200);


?>
<!DOCTYPE html>
<html>
    <head>
        <title>Imagesample</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <img src="cache/shop/original.jpg" style="margin: 25px; border: 2px solid blue;">
    </body>
</html>
Hallo Frank, dus als ik het goed begrijp, wordt een ingevoerde afbeelding kleiner gemaakt en wordt er een vierkant van gemaakt. Vervolgens wordt hij geuploaded/verplaatst naar de aangewezen dir. Bedankt voor je antwoord, trouwens.
Jeroen,

Eigenlijk wordt er een nieuwe afbeelding gemaakt van (in dit voorbeeld) 200 x 200 pixels. Dan wordt deze met de kleur wit gevuld en vervolgens wordt er een andere afbeelding op de nieuwe afbeelding geplakt en dat zo dat er of onder en boven of links en rechts een witruimte ontstaat. Als laatste wordt de afbeelding die tot dusver enkel een object in het geheugen van de computer was opgeslagen in een directory naar keuze.

Al bij al een redelijk dure operatie die je het liefst één keer doet en hem dan gewoon opslaat voor hergebruik. Enkel wanneer je deze operatie uitvoert is aan jou. Je kunt dan denken aan eenmalig direct wanneer een afbeelding geüpload wordt door een medewerker of misschien wel wanneer de benodigde afbeelding ontbreekt.
ook nog misschien handig is imagecolortransparent
Als in Franks's voorbeeld wit dan gebruik je wit als transparant en zie je dat niet als jouw sites achtergrond een ander kleur heeft. Dit terwijl de breedte/hoogte van 200 toch blijft
Hallo Frank, bedankt voor je antwoord. Nu begrijp ik de functie beter!

[size=xsmall]Toevoeging op 03/04/2020 08:39:35:[/size]

Hallo Jan, Fijn dat je meedenkt, maar een witte achtergrond is prima. Toch bedankt!
Hallo Frank,

Ik heb de functie geprobeerd, maar hij geeft een foutmelding.

Dit is de code die ik geprobeerd heb:

<?php

function get_date($sql_date) {
	$time = strtotime($sql_date);
	
	$dag = date("j", $time);
	$jaar = date("Y", $time);
	
	$maanden = array('januari','februari','maart','april','mei','juni','juli','augustus','september','oktober','november','december');
	$maand = $maanden[(date("m", $time) - 1)];
	
	$date = $dag.' '.$maand.' '.$jaar;
	return $date;
}

function cacheImage($srcFile, $targetDir, $width, $height) {
	// Laad orignele afbeelding van uit het bestand en maak er een truecolor afbeelding van
	$src = imagecreatefromjpeg($srcFile);
	imagepalettetotruecolor($src);

	// Voor het resultaat maken we een nieuwe afbeelding aan in het geheugen
	$dest = imagecreatetruecolor($width, $height);

	// vul de achtergrond op met een witte kleur
	$white = imagecolorallocate($src, 255, 255, 255);
	imagefill($dest, 0, 0, $white);

	// bepaal de verhouding tussen breedte en hoogte
	$r = imagesx($src) / imagesy($src);

	// maak een onderscheid tussen landscape en portret afbeeldingen
	if(imagesx($src) > imagesy($src)) {
		// landscape
		$w = $width;
		$h = $height / $r;
		// plak de afbeelding op de juiste positie en in de juiste afmetingen in de nieuwe afbeelding
		imagecopyresampled($dest, $src, 0, ($height-$h)/2, 0, 0, $w, $h, imagesx($src), imagesy($src));
	} else {
		// portret
		$w = $width * $r;
		$h = $height;
		// plak de afbeelding op de juiste positie en in de juiste afmetingen in de nieuwe afbeelding
		imagecopyresampled($dest, $src, ($width-$w)/2, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
	}

	// indien de cache directory niet bestaat maak hem aan
	@mkdir($targetDir, 0777, true);

	// Sla de nieuwe afbeelding op.
	imagejpeg($dest, $targetDir . '/' . $srcFile);

	// even netjes het geheugen vrij maken
	imagedestroy($dest);
	imagedestroy($src);
}

cacheImage('chiffon.jpeg', 'nieuw', 200, 200);

?>


En dit is de foutmelding die ik heb gekregen:
Warning: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error: in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 627 Warning: imagecreatefromjpeg(): 'chiffon.jpeg' is not a valid JPEG file in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 627 Warning: imagepalettetotruecolor() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 628 Warning: imagecolorallocate() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 634 Warning: imagesx() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 638 Warning: imagesy() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 638 Warning: Division by zero in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 638 Warning: imagesx() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 641 Warning: imagesy() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 641 Warning: imagesx() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 652 Warning: imagesy() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 652 Warning: imagecopyresampled() expects parameter 2 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 652 Warning: imagedestroy() expects parameter 1 to be resource, boolean given in /volume1/web/jeroenvanrensen/wauwcloset/admin/index.php on line 663

Snap jij wat er fout is gegaan?
Als ik op de eerste foutmelding richt, die het belangrijkste is (de rest is een kettingreactie omdat er geen geldige resource is), dan gok ik erop dat je geen geldige jpeg-afbeelding erin gooit.

Hier zou tevens een nette foutafhandeling omheen kunnen, met bijvoorbeeld een exception. Of voor het gemak een nette error in een afbeelding ;-)
Wat bedoel je met een "nette" foutafhandeling en een "nette" error? Die begrippen ken ik niet.

Reageren