In this modified example from a file of values ​​(meteoclimatic.htm) simple graphics (located in the images directory) with built-in graphics functions PHP , completing the graphics is very fast and versatile.
a link to the complete sample:
meteo.zip
The main script code:
 

 <?php
//-------------------------------------------- Lectura de dades del fitxer  ----------------------------
 
//llegim dades de fitxer
$myFile = "meteoclimatic.htm";
$fh = fopen($myFile, 'r');
$tamany=filesize($myFile);
$theData = fread($fh,$tamany);
fclose($fh);



//-------------------------------------------- Termometre ----------------------------------------------
//cargamos la imagen desde un archivo jpg
$image = imagecreatefrompng('images/termo.png');
 
$hora=substr( $theData ,strrpos($theData, "*UPD=") + 16, 5);
$dia=substr( $theData ,strrpos($theData,  "*UPD=") + 5 ,10 );
$temperatura=substr( $theData ,strrpos($theData, "*TMP=") + 5, strrpos($theData, "*WND=")-(strrpos($theData, "*TMP=") + 7));
$minima=substr( $theData ,strrpos($theData, "*DLTM=") + 6, strrpos($theData, "*DHHM=")-(strrpos($theData, "*DLTM=") + 8));
$maxima=substr( $theData ,strrpos($theData, "*DHTM=") + 6, strrpos($theData, "*DLTM=")-(strrpos($theData, "*DHTM=") + 8));
 
//echo($temperatura);
//echo($maxima);
//echo($minima);
 
//asignamos los colores que utilizaremos después
$white = ImageColorAllocate($image, 255, 255, 255);
$black = ImageColorAllocate($image, 0, 0, 0);
$red = ImageColorAllocate($image, 255, 0, 0);
$blue = ImageColorAllocate($image, 0, 0, 255);
$gr = ImageColorAllocate($image, 0, 120, 0);
 
//leemos el tamaño de la imagen
$width = imagesx($image);
$height = imagesy($image);
 
//colocamos el texto termometro
imagestring($image, 2, 65, 9, " 40", $black);
imagestring($image, 2, 65, 49, " 30", $black);
imagestring($image, 2, 65, 89, " 20", $black);
imagestring($image, 2, 65, 129, " 10", $black);
imagestring($image, 2, 65, 169, "  0", $black);
imagestring($image, 2, 65, 209, "-10", $black);
 
//Temperatura
//$temperatura= 24.2;
//$minima=10.5;
//$maxima=30.2;
imagestring($image, 3, 30, 235, $temperatura . "", $black);
imagestring($image, 1, 10,250, $hora, $gr);
imagestring($image, 1, 40, 250, $dia, $gr);
 
$temp=($temperatura+ 10)*4;
imagefilledrectangle($image, 41,(216-$temp), 47, 216, $red);
//maxima
$temp=($maxima+ 10)*4;
imageline($image, 8,(216-$temp),37,(216-$temp), $red);
imagestring($image, 3,10, (202-$temp), $maxima, $red);
//minima
$temp=($minima+ 10)*4;
imageline($image, 8,(216-$temp),37,(216-$temp), $blue);
imagestring($image, 3,10, (217-$temp), $minima, $blue);
 
//definimos el encabezado de acuerdo con el tipo de datos de salida
//header("Content-type: image/png");
//generamos la imagen
imagepng($image,"termo.png");
//imagepng($image);
//liberamos la memoria ocupada por la imagen
imagedestroy($image);
 
//-------------------------------------------- Vent ----------------------------------------------
//cargamos la imagen desde un archivo jpg
$image = imagecreatefrompng('images/vent.png');
 
$viento=substr( $theData ,strrpos($theData, "*WND=") + 5, strrpos($theData, "*AZI=")-(strrpos($theData, "*WND=") + 7));
$racha=substr( $theData ,strrpos($theData, "*WRUN=") + 6, strrpos($theData, "*MHTM=")-(strrpos($theData, "*WRUN=") + 8));
$maxracha=substr( $theData ,strrpos($theData, "*DGST=") + 6, strrpos($theData, "*DSUN=")-(strrpos($theData, "*DGST=") + 8));
$direc=substr( $theData ,strrpos($theData, "*AZI=") + 5, strrpos($theData, "*BAR=")-(strrpos($theData, "*AZI=") + 7));
 
//asignamos los colores que utilizaremos después
$white = ImageColorAllocate($image, 255, 255, 255);
$black = ImageColorAllocate($image, 0, 0, 0);
$red = ImageColorAllocate($image, 255, 20, 0);
$blue = ImageColorAllocate($image, 0, 0, 180);
$green = ImageColorAllocate($image, 0, 180,0);
$yelow = ImageColorAllocate($image, 180, 180,0);
 
//leemos el tamaño de la imagen
$width = imagesx($image);
$height = imagesy($image);
 
//colocamos el texto termometro
imagestring($image, 3, 190, 51, $viento, $green);
//imagestring($image, 3, 190, 73, $racha, $blue);
imagestring($image, 3, 260, 51, $maxracha, $red);
 
imagefilledrectangle($image, 141,31, 141+($maxracha*1.5), 36, $red);
//imagefilledrectangle($image, 141,31, 141+($racha*1.5), 36, $blue);
imagefilledrectangle($image, 141,31, 141+($viento* 1.5), 36, $green);
 
//imageline($image, 141+$maxracha,31,141+$maxracha,36, $green);
imagesetthickness($image, 2);
//N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SSO, SW, SO, WSW, OSO, W, O, WNW, ONO, NW, NO, NNW, NNO
switch ($direc) {
case "N":
    imageline($image, 67, 66, 67, 66-37, $red);
break;
case "NNE":
    imageline($image, 67, 66, 67+(0.38*37), 66-(0.92*37), $red);
break;
case "NE":
    imageline($image, 67, 66, 67+(0.71*37), 66-(0.71*37), $red);
break;
case "ENE":
    imageline($image, 67, 66, 67+(0.92*37), 66-(0.38*37), $red);
break;
case "E":
    imageline($image, 67, 66, 67+37, 66, $red);
break;
case "ESE":
    imageline($image, 67, 66, 67+(0.92*37), 66+(0.38*37), $red);
break;
case "SE":
    imageline($image, 67, 66, 67+(0.71*37), 66+(0.71*37), $red);
break;
case "SSE":
    imageline($image, 67, 66, 67+(0.38*37), 66+(0.92*37), $red);
break;
case "S":
    imageline($image, 67, 66, 67, 66+37, $red);
break;
case "SSW":
    imageline($image, 67, 66, 67-(0.38*37), 66+(0.92*37), $red);
break;
case "SW":
    imageline($image, 67, 66, 67-(0.71*37), 66+(0.71*37), $red);
break;
case "WSW":
    imageline($image, 67, 66, 67-(0.92*37), 66+(0.38*37), $red);
break;
case "W":
    imageline($image, 67, 66, 67-37, 66, $red);
break;
case "WNW":
    imageline($image, 67, 66, 67-(0.92*37), 66-(0.38*37), $red);
break;
case "NWW":
    imageline($image, 67, 66, 67-(0.92*37), 66-(0.38*37), $red);
break;
case "WNW":
    imageline($image, 67, 66, 67-(0.92*37), 66-(0.38*37), $red);
break;
case "NW":
    imageline($image, 67, 66, 67-(0.71*37), 66-(0.71*37), $red);
break;
case "NNW":
    imageline($image, 67, 66, 67-(0.38*37), 66-(0.92*37), $red);
break;
}
if ($viento &lt; 2) {
	imagestring($image, 3, 141, 126, "Calma", $black);
} elseif ($viento &lt;6) {
	imagestring($image, 3, 141, 126, "Ventolina", $black);
	imagefilledrectangle($image, 141,104, 149, 112, $green);
} elseif ($viento&lt;12) {
	imagestring($image, 3, 141, 126, "Brisa molt debil", $black);
	imagefilledrectangle($image, 141,104, 149, 112, $green);
	imagefilledrectangle($image, 152,104, 160, 112, $green);
} elseif ($viento&lt;20) {
	imagestring($image, 3, 141, 126, "Brisa debil", $black);
	imagefilledrectangle($image, 141,104, 149, 112, $green);
	imagefilledrectangle($image, 152,104, 160, 112, $green);
	imagefilledrectangle($image, 163,104, 171, 112, $green);
} elseif ($viento&lt;30) {
	imagestring($image, 3, 141, 126, "Brisa Moderada", $black);
	imagefilledrectangle($image, 141,104, 149, 112, $green);
	imagefilledrectangle($image, 152,104, 160, 112, $green);
	imagefilledrectangle($image, 163,104, 171, 112, $green);
	imagefilledrectangle($image, 174,104, 182, 112, $green);
} elseif ($viento&lt;40) {
	imagestring($image, 3, 141, 126, "Brisa fresca", $black);
	imagefilledrectangle($image, 141,104, 149, 112, $green);
	imagefilledrectangle($image, 152,104, 160, 112, $green);
	imagefilledrectangle($image, 163,104, 171, 112, $green);
	imagefilledrectangle($image, 174,104, 182, 112, $green);
	imagefilledrectangle($image, 185,104, 193, 112, $yelow);
} elseif ($viento&lt;50) {
	imagestring($image, 3, 141, 126, "Brisa forta", $black);
	imagefilledrectangle($image, 141,104, 149, 112, $green);
	imagefilledrectangle($image, 152,104, 160, 112, $green);
	imagefilledrectangle($image, 163,104, 171, 112, $green);
	imagefilledrectangle($image, 174,104, 182, 112, $green);
	imagefilledrectangle($image, 185,104, 193, 112, $yelow);
	imagefilledrectangle($image, 196,104, 204, 112, $yelow);
} elseif ($viento&lt;60) {
	imagestring($image, 3, 141, 126, "Vent fort", $black);
	imagefilledrectangle($image, 141,104, 149, 112, $green);
	imagefilledrectangle($image, 152,104, 160, 112, $green);
	imagefilledrectangle($image, 163,104, 171, 112, $green);
	imagefilledrectangle($image, 174,104, 182, 112, $green);
	imagefilledrectangle($image, 185,104, 193, 112, $yelow);
	imagefilledrectangle($image, 196,104, 204, 112, $yelow);
	imagefilledrectangle($image, 207,104, 215, 112, $red);
} elseif ($viento&lt;74) {
	imagestring($image, 3, 141, 126, "Vent Dur", $black);
	imagefilledrectangle($image, 141,104, 149, 112, $green);
	imagefilledrectangle($image, 152,104, 160, 112, $green);
	imagefilledrectangle($image, 163,104, 171, 112, $green);
	imagefilledrectangle($image, 174,104, 182, 112, $green);
	imagefilledrectangle($image, 185,104, 193, 112, $yelow);
	imagefilledrectangle($image, 196,104, 204, 112, $yelow);
	imagefilledrectangle($image, 207,104, 215, 112, $red);
	imagefilledrectangle($image, 218,104, 226, 112, $red);
}
 
imagepng($image,"vent.png");
//imagepng($image);
//liberamos la memoria ocupada por la imagen
imagedestroy($image);
//-------------------------------------------- Humitat,Pressio, hora ----------------------------------------------
//cargamos la imagen desde un archivo jpg
$image = imagecreatefrompng('images/Humitat.png');
 
$hora=substr( $theData ,strrpos($theData, "*UPD=") + 16, 5);
$dia=substr( $theData ,strrpos($theData,  "*UPD=") + 5 ,10 );
$pluja=substr( $theData ,strrpos($theData, "*DPCP=") + 6, strrpos($theData, "*WRUN=")-(strrpos($theData, "*DPCP=") + 8));
$humitat=substr( $theData ,strrpos($theData, "*HUM=") + 5, strrpos($theData, "*SUN=")-(strrpos($theData, "*HUM=") + 7));
$pressio=substr( $theData ,strrpos($theData, "*BAR=") + 5, strrpos($theData, "*HUM=")-(strrpos($theData, "*BAR=") + 7));
 
//asignamos los colores que utilizaremos después
$white = ImageColorAllocate($image, 255, 255, 255);
$black = ImageColorAllocate($image, 0, 0, 0);
$red = ImageColorAllocate($image, 255, 20, 0);
$blue = ImageColorAllocate($image, 0, 0, 180);
$green = ImageColorAllocate($image, 0, 180,0);
$yelow = ImageColorAllocate($image, 180, 180,0);
 
//leemos el tamaño de la imagen
$width = imagesx($image);
$height = imagesy($image);
 
//colocamos el texto dia hora
$p=$pluja . " mm";
imagestring($image, 3, 30,12, $hora, $black);
imagestring($image, 3, 13, 33, $dia, $black);
//colocamos el texto lluvia
if ($pluja!=" ") {
    imagestring($image, 3, 50, 80, $p , $blue);
    imagefilledrectangle($image, 101,137, 111, 138-$pluja, $blue);
}else {
    imagestring($image, 3, 50, 80, "0 mm" , $blue);
}
 
//colocamos el texto humedad
imagestring($image, 3, 160+$humitat-20, 45, $humitat . "%" , $black);
imageline($image, 160+$humitat, 18, 160+$humitat, 35, $red);
 
//colocamos el texto pression
imagestring($image, 3, 180, 100, $pressio . "mb" , $black);
imageline($image, 155+(($pressio-960)*1.3),73,155+(($pressio-960)*1.3),84, $red);
 
imagepng($image,"humitat.png");
//imagepng($image);
//liberamos la memoria ocupada por la imagen
imagedestroy($image);
?&gt;
 

Results:
Viento

Facebooktwitterredditpinterestlinkedinmail