PHP afbeelding maken met PHP en SQL

Status
Niet open voor verdere reacties.

pilootnour5

Terugkerende gebruiker
Lid geworden
22 nov 2008
Berichten
1.895
Beste,

Ik heb een site waar men zijn tankbeurten bij kan houden en daarmee zijn verbruik van de auto in kaart kan brengen. Op de site kun je statistische gegevens genereren die worden geladen uit een MySQL database. Dit doe ik door middel van PHP. Nu heb ik een kleine widget gemaakt die mijn gebruikers op hun site kunnen zetten, waarop hun verbruik kort staat vermeld, deze widget werkt met een iFrame, echter heeft dit natuurlijk wel beperkingen. Zo kun je de widget niet plaatsen op bijvoorbeeld een forum (zoals in de handtekening). Nu weet ik dat het mogelijk is om een dynamisch afbeelding te laten genereren met data uit de database.

Als voorbeeld heb ik brandstofprijzen.info gepakt. Zij leveren ook een widget, en dit is een afbeelding. De instelingen van deze afbeelding kun je wijzigen in de URL van de afbeelding. Hier zie je dat:
Code:
http://www.brandstofprijzen.info/brandstofeu.php?land=1&fontsize=15&fontcolor=10&bgcolor=1&rand=10 border="0"

Nu wil ik iets soortgelijks maken. De kleuren van de afbeeldingen zijn in principe gewoon vast, echter moet de data die in de afbeelding staat wel kloppen met die van de database.

Misschien is het allemaal heel vaag, dus hier even de widget als link:
http://nour.nl/tanken/widget.php?id=1

De maat van deze widget is ongeveer 200 bij 60. Kan ik van deze php pagina een afbeelding automatisch laten genereren? En hoe moet ik dat aanpakken?

Alvast dank! Ik heb de laatste maand ontzettend veel stappen gezet in het programmeren in PHP.
 
Heb je al eens naar GDlibrary gekeken? Daarmee kan je afbeeldingen genereren.

Een goede tip: Cache de afbeeldingen zodat ze niet steeds on-the-fly worden gegenereerd.
 
Ja ik ben daar nu toevallig naar aan het kijken. Als je op http://nour.nl/gd.php kijkt zie je dat er een test afbeelding gemaakt wordt. De vraag is nu of dit nu ergens wordt opgeslagen of iets dergelijks?
 
Ik heb geen inzicht in je code, maar het cachen gebeurt niet vanzelf in ieder geval.
Ikzelf gebruik gebruik dit voor een usergenerated-image:

<?php
$cachename = "cached/" . md5($text) . ".png";
?>

Bij het ophalen van de afbeelding kijk ik eerst met file_exists() of $cachename bestaat. Zo ja, dan haal ik deze met readfile op(), en geef de juiste png header mee.
Als de afbeelding nog niet bestaat, dan maak ik hem netjes aan. Bij de imgpng() functie, als tweede argument gebruik ik dan $chachename.
 
Ik heb alvast een achtergrond gemaakt waar alleen nog het gemiddelde verbruik in hoeft worden gezet door de PHP code.
verbruik-ag.png

Ik vind overal een helehoop codes, echter nog zonder de mogelijk om iets over een achtergrond heen te plakken.
 
<?php
header('Content-type: image/jpeg');
$jpg_image = imagecreatefromjpeg('background.jpg');

$white = imagecolorallocate($jpg_image, 255, 255, 255);
$font_path = 'font.TTF';
$text = "Test!";

imagettftext($jpg_image, 25, 0, 75, 300, $white, $font_path, $text);
imagejpeg($jpg_image);

imagedestroy($jpg_image);
?>
 
Dank voor je code. Ik heb nu het volgende:
<?php
header('Content-type: image/jpeg');
$jpg_image = imagecreatefromjpeg('/images/verbruik-ag.jpg');

$white = imagecolorallocate($jpg_image, 255, 255, 255);
$font_path = '/verdana.ttf';
$text = "Test!";

imagettftext($jpg_image, 25, 0, 75, 300, $white, $font_path, $text);
imagejpeg($jpg_image);

imagedestroy($jpg_image);
?>

Ik heb het pad naar het achtergrond veranderd en verwezen naar mijn font. Deze staat in de hoofddirectory. Als ik nu de pagina open krijg ik een afbeelding met een klein vraagtekentje, zie nour.nl/gd.php

Doe ik iets fout?
:: EDIT ::
Ik heb het pad naar de afbeelding nu direct gedaan met de volledige url, wist niet waarom dat nou per se moest. Nu krijg ik in ieder geval de achtergrond geladen
:: EDIT 2 ::
Inmiddels ben ik erachter dat er bij het verwijzen naar de font er geen / voor mag staan, dit stond op php.net
:: FINAL EDIT ::

Het werkt nu. Mijn code ziet er als volgt uit:

if(isset($_GET['id'])){
$id = $_GET['id'];;

$sqlgem = Query om het gemiddelde te berekenen van de betreffende gebruiker;

$resultgem = $conn->query($sqlgem);
if ($resultgem->num_rows > 0) {
while($row = $resultgem->fetch_assoc()) {

//echo $row['gemiddeld'];
$text = $row['gemiddeld'];
}
} else {
// echo "Geen data.<br />";
}



header('Content-type: image/jpeg');
$jpg_image = imagecreatefromjpeg('http://www.nour.nl/images/verbruik-ag.jpg');

$white = imagecolorallocate($jpg_image, 255, 255, 255);
$font_path = 'verdanab.ttf'; // Ik gebruik hier Verdana Bold
//$text = $id;

//imagettftext($jpg_image, 25, 0, 75, 300, $white, $font_path, $text);
imagettftext($jpg_image, 11, 0, 36, 41, $white, $font_path, $text);
imagejpeg($jpg_image);


imagedestroy($jpg_image);

}

Je kunt het resultaat bekijken op http://www.nour.nl/tanken/widgetjpg.php?id=1

Kwaliteit is echter nog niet optimaal. Kan ik hier nog wat aan veranderen?
 
Laatst bewerkt:
Je genereert het nu on-the-fly. Ik hoop niet dat het plaatje veel gebruikt gaat worden, want bij elke keer moet de server alles weer ophalen.
Dus ik raad aan om de boel netjes te cachen als de data met regelmaat verandert.

Persoonlijk zou ik PNG gebruiken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan