PHP Avanzato: Creazione immagini con librerie GD
autore: Orebla
xx/xx/xx
Creare una firma dinamica in PHP e GD, la Guida
Prefazione:
Iniziamo in tanto con lo spiegare cos'è una
firma dinamica. Una firma dinamica ci permette di rendere più bella la nostra
presenza su un forum e poi ci permette di pubblicizzare il nostro sito se
vogliamo, dirigendo la dinamicità della nostra firma verso i dati del nostro
website, cioè visitatori utenti del forum insomma tutti i dati che vogliamo e
tutto ciò apparirà agli occhi di tutti come una semplice immagine.
Gli strumenti:
Cosa serve per produrre tutto ciò? Per prima
cosa ricordo che non è richiesto da parte dell'utente nessun requisito minimo
speciale. Infatti le immagine (png/jpg/gif) sono visualizzabili su qualunque
Browser (Internet Explorer, Mozilla Firefox, Opera).
Viene invece richiesto qualcosa di più per la
creazione, infatti dovremo avere a nostra disposizione le librerie GD con
supporto PHP, la versione non importa dato che vi sono frequenti aggiornamenti.
Per trovare le librerie vi basta fare un giro sul sito ufficiale di
PHP.net.
Dalla versione 5 di PHP questa libreria per
quasi tutti i tipi di immagini sono incluse nei moduli, per attivarle vi basta
aprire il file php.ini e arrivare alla riga che presenta questa stringa :
;extension=php_gd2.dll
(sono compresi i punto e virgola). Arrivati qui vi basta levare i ";"
(punto e virgola) da davanti per attivare le librerie relative GD.
Ovviamente tutto questo, da parte della
creazione, pretende l'ausilio di un web Server e dei moduli PHP.
I caratteri delle librerie
GD:
Ora avremo bisogno per la creazione della
nostra firma dinamica di fonts compatibili per poi ottenere come output
l'immagine.
Più informazioni a questo indirizzo:
Gd
fonts.
Possiamo anche crearci il nostro fonts, alcuni
link per approfondire l'argomento:
-
User-defined
Bitmap Fonts Guide
-
GD Fonts for PHP imageloadfont()
Le configurazioni di Apache:
Prima cosa, dobbiamo creare tutte le nostre
cartelle dove metteremo i nostri file per ottenere la nostra firma digitale:
root/firma/
root/fonts_gd/
root/include/
root/immagine/
Dopo aver creato le nostre cartelle possiamo
procedere con le configurazioni necessarie, ci basta creare due file .htacces.
Il primo è da salvare nella cartella /firma/. Creiamo quindi questo file .htacces:
1-Apriamo il Notepad e mettiamo all'interno il
seguente testo:
SetHandler application/x-httpd-php
2- Salviamo il tutto nella cartella /firma/ con conf.txt, ora dopo averlo
salvato rinominiamolo come .htaccess ;
Questo dice al server Apache di processare i
file PNG come se fossero script PHP. Questo ci serve per generare le nostre
firme dinamiche in quanto sono script PHP ma poi le rinomineremo in PNG, per
permetterci di richiamarla proprio come un immagine.
Ora dobbiamo creare un altro htaccess file da
mettere nella cartella /immagine/:
1- Apriamo il Notepad e scriviamo quanto
segue:
order deny,allow
deny from all
2- Salviamo il tutto nella cartella
sopra citata (cioè /immagine/) come conf.txt, poi lo rinominiamo come .htacces
;
Questo a differenza del primo impedisce a
chiunque di ottenere accesso HTTP diretto alla cartella immagini (spiegheremo
poi cosa conterrà), restituendo un HTTP 403 error.
Carichiamo le risorse:
Se avete trovato qualche GDFonts che vi
interessa lo potete utilizzare e caricare nella cartella /fonts_gd/.
Ora per questa firma noi utilizzeremo una
immagine di sfondo già creata, per ottenere così una migliore
personalizazzione. Create quindi una immagine di sfondo come queste:
 |
Dimensioni:
Width: 39
Height: 380 |
 |
|
Salviamola quindi nella cartella /immagini/ e
la chiamiamo
personal.gif.
Creiamo quindi uno script PHP e lo salviamo
nella cartella /include/ chiamandolo
imm_dinamica.php;
Ecco il testo dello script:
$gdfonts = array(
'8x13iso', '9x15iso', 'andale12', 'atommicclock', 'bmreceipt',
'chowfun', 'courier8', 'dimurph', 'georgia8', 'proggyclean',
'proggysquare', 'systemex', 'terminal6', 'trisk'
);
//
//
//
if( !isset($image_info) || !isset($image_text) )
{
exit;
}
//
//
//
$sz = @getimagesize('./immagini/'.$image_info['image']);
if( !$sz )
{
exit;
}
$image_w = $sz[0];
$image_h = $sz[1];
//
//
//
@header('Content-type: image/png');
$im = @imagecreatefromgif('./immagine/'.$image_info['image']);
$rgb = ( isset($image_info['color']) ? $image_info['color'] : array(255, 255, 255) );
$bgColor = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]);
for( $i = 0; $i < count($image_text); $i++ )
{
if( !is_numeric($image_text[$i]['font']) )
{
$font = 1;
}
else if( $image_text[$i]['font'] < 0 )
{
$font = $image_text[$i]['font'] * -1;
}
else
{
if( !($font = @imageloadfont('./fonts_gd/'.$gdfonts[$image_text[$i]['font']].'.gdf')) )
{
$font = 1;
}
}
$rgb = $image_text[$i]['color'];
$fgColor = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]);
imagestring($im, $font, $image_text[$i]['x'], $image_text[$i]['y'], $image_text[$i]['text'], $fgColor);
}
imagepng($im);
imagedestroy($im);
L'Array $gdfonts
lo potete personalizzare inserendo i nomi dei Fonts che avete caricato nella
cartella /fonts_gd/.
Creiamo la nostra firma
dinamica:
Adesso scriviamo il nostro primo script che genererà la nostra prima firma
dinamica, inseriamo questo script PHP:
$image_info = array(
'image' => 'personal.gif'
);
$image_text = array(
array(
'x' => 8,
'y' => 6,
'color' => array(50, 100, 180),
'font' => 9,
'text' => " Ecco la firma dinamica"
),
array(
'x' => 8,
'y' => 22,
'color' => array(50, 100, 180),
'font' => 9,
'text' => " Bella?? "
)
);
include('./include/imm_dinamica.php');
Una volta inserito questo codice nello script
PHP salviamolo come fir_dinamica.png, il risultato sarà questo:
Spieghiamo un po' il codice
presente:
- $image_info['image']:
questo è il nome dell'immagine di sfondo salvata in root/firma/immagini.
Notate che l'immagine è GIF se volete creare una firma dinamica con alri
tipi di immagini di sfondo dovete modificare il seguente file: root/sig/include/imm_dinamica.php.
- $image_text:
in questo sono contenute le informazioni per creare le scritte, noterete che
sono presenti diversi elementi: X, Y, COLOR, FONT e TEXT. Sono
rispettivamente le coordinate da dove far iniziare la scritta (X,Y) vi
ricordo che non sono nell'ordine come un normale grafico cartesiano; poi vi
è definito lo stile del colore tramite un array che definisce le parti di
Rosso (primo elemento), Verde (secondo elemento) e Blu(terzo elemento);
ricordatevi che i numeri vanno da 0 a 255.
Invece il Font presenta il numero dell'elemento dell'array presente in imm_dinamica.php.
Inseriamo i dati del nostro
forum phpBB:
Se invece siamo interessati ad inserire alcuni
dati relativi al nostro forum phpBB non ci vuole altro che il codice per
interrogare le tabelle di phpBB e poi inserire il risultato in una variabile ed
inserirla nell'array $image_text.
Mettiamo per esempio che vogliamo far comparire
l'ultimo messaggio inviato compreso di autore, ecco il codice:
//
// Setup the relative path to your phpBB folder...
//
$phpbb_root_path = '../phpBB2/';
//
// Initialize phpBB and user session...
//
define('IN_PHPBB', true);
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
//
// Get the list of forums the current user is allowed to view...
//
$is_auth_ary = auth(AUTH_VIEW, AUTH_LIST_ALL, $userdata);
$auth_data_sql = '';
foreach( $is_auth_ary as $fid => $is_auth_row )
{
if( $is_auth_row['auth_view'] )
{
$auth_data_sql .= ( $auth_data_sql != '') ? ', ' . $fid : $fid;
}
}
if( empty($auth_data_sql) )
{
$auth_data_sql = -1;
}
//
// Retrieve the latest active topic title...
//
$sql = "SELECT t.topic_title, u.username, p.post_time
FROM ". TOPICS_TABLE ." AS t,
". FORUMS_TABLE ." AS f,
". USERS_TABLE ." AS u,
". POSTS_TABLE ." AS p
WHERE f.forum_id = t.forum_id
AND t.topic_last_post_id = p.post_id
AND p.poster_id = u.user_id
AND f.forum_id in ( $auth_data_sql )
ORDER BY t.topic_last_post_id DESC
LIMIT 1";
if( !($result = $db->sql_query($sql)) || !($row = $db->sql_fetchrow($result)) )
{
// Uncomment the following line for debug purposes
// message_die(GENERAL_ERROR, 'Could not query DB', '', __LINE__, __FILE__, $sql);
$text = array(
"Sorry, I couldn't retrieve the requested information.",
""
);
}
else
{
$post_date = create_date($board_config['default_dateformat'], $row['post_time'], $board_config['board_timezone']);
$text = array(
"Latest post by " . $row['username'] . ', ' . $post_date,
"Title: " . $row['topic_title']
);
}
// --------------------------------------------------------------------------------
$image_info = array(
'image' => 'personal.gif'
);
$image_text = array(
array(
'x' => 8,
'y' => 6,
'color' => array(50, 100, 180),
'font' => -2,
'text' => $text[0]
),
array(
'x' => 8,
'y' => 21,
'color' => array(50, 100, 180),
'font' => -2,
'text' => $text[1]
)
);
include('./include/imm_dinamica.php');
Ecco ora non dobbiamo salvare
questo file nella cartella /firm/ e chiamarlo come phpbb_firma.png.
Conclusioni e
Ringraziamenti:
Questa guida è stata scritta
volutamente così, cioè semplice e non piena di esempio su come creare query
difficili per estrarre dati dal database oppure riconoscere Browser e Sistemi
Operativi, giusto per essere alla portata di tutti. Stà poi a voi di creare
aggiunte per ottenere diverse informazioni oppure diverse immagini. Saranno poi
rilasciate più avanti altre guide di supplemento per spiegare come fare per
ottenere diverse info.
Devo dare però tutto il merito di
questa guida ai siti da cui ho preso spunto, il sito principale è stato
www.phpmix.com.