Sai, vecchio, non vedevo niente del genere da molto tempo. Sembrava persino che l'anime dovesse essere legato. La vecchiaia si insinuò impercettibilmente e tutti questi ragazzi con spade da tiro e ragazze dai capelli vivaci si fusero in una massa appiccicosa continua. Sembrava che tutti i personaggi parlassero solo stupidamente, solo ad alta voce e solo dell'eterno. E tutto ribolle di follia giovanile mecha-fantasy, wow!.. E quanto sono felice di aver trovato "Teatro ...". Che cosa sembra? Su, come siamo abituati a vederla, non troppo. Cioè, disegnare qualcosa - sì, certo. E in termini di umore, "tira" di più su "", probabilmente. O ai vecchi cortometraggi georgiani (ve li ricordate?), che sono “più simili alla vita”. Tutti i tipi di persone diverse, giovani e al contrario, parlano, vivono, si conoscono, lavorano... Certo, qualche momento chiave è preso per la trama, non il più di routine. Ma quanto è bello che questo momento chiave non sia il primo bacio e non l'acquisizione di potere mistico, ma, ad esempio, l'incontro con i compagni di classe molti anni dopo, o il licenziamento da un lavoro ben pagato, o l'incontro con tua suocera. “C'è vita dopo i 30 anni?” Sì? Mi piace pensare che ci sia. E mi piace che anche Rumiko Takahashi la pensi così.
Non urlare, micio, non ci metterò molto. Sto già controllando. E in generale, cosa significa "il mio computer" ?! E allora dov'è il mio?.. Dopotutto, a volte ho anche bisogno di guardare uno o due anime. Guarda, ha riempito tutto "" e "" ... Posso chiedere, una volta nella vita con calma ?! Cosa sto guardando? Rumiko Takahashi Theatre, ci sono delle scatole laggiù... Perché diavolo, coniglietto? In primo luogo, non è spazzatura, è solo il 2003, e in secondo luogo, "" ti piace ", "" leggi con piacere - il mangaka è lo stesso, ma non berrai l'abilità, fringuello. Takahashi-san sa disegnare e incuriosire molto bene... Perché allora la serie è così breve? E questa non è una serie, questa è una serie di cortometraggi - con trame separate, con personaggi diversi. Divertente o in lacrime? E quelli, e quelli - vedi, è scritto: "dramma", "commedia", "vita quotidiana" ... Non ti piace la "vita quotidiana"? Non parlare così, topolino, altrimenti non ti amerà neanche lei. Una buona routine quotidiana è una grande cosa! Lascia che ti mostri come hanno nascosto un pinguino ai vicini nel Krusciov giapponese. Seriyushka per mamma, come durante l'infanzia, e andrò a cucinare la cena, ok? ..
Ho appena pianto, dannazione! Non pensavo che sarei stato in grado di entrare in cose del genere! Ed è divertente, perdio, è divertente, soprattutto su una donna anziana che è uscita dal coma e sta cercando il motivo per cui è stata riportata in vita. E questa sua storia d'amore preistorica attraverso occhi diversi: come racconta se stessa, e come - il suo soggetto; quello che viene chiamato "senti la differenza!". E il lieto fine sulle gambe della vecchia che si spezzano, ho appena rosicchiato il cuscino dalla tenerezza!.. E l'episodio sul palazzo delle nozze! Amo così tanto le vere storie romantiche, non quando tutto è patinato dallo smalto glamour, ma quando puoi davvero simpatizzare con una persona vivente. E per quanto riguarda l'invecchiamento di marito e moglie, questi rimpianti sono così ben trasmessi, questi tentativi di catturare la giovinezza con la coda sfuggente e già rognosa ... e tutto finisce così saggiamente e bene. Ho anche pensato: forse anche i miei antenati non sono del tutto indifferenti l'uno all'altro, ma si sono semplicemente dimenticati come dimostrarlo con l'età ...
Sto guardando la serie di notte. Lentamente. Sono molto diversi, non vuoi confonderli. È come se stessi visitando posti diversi. E l'umore è completamente diverso e le impressioni. NO. Probabilmente non ti piacerà. Perché niente di speciale. E surreale Stesso. E anche lo "psicologismo" - "infanzia difficile, mancanza di vitamine, avrebbe comprato un gameboy in tempo, bastardi, vedi, non sarebbe diventato un killer maniaco" - no. E niente di particolarmente istruttivo. Queste cose fondamentalmente non insegnano nulla. Cosa può insegnare la vita di qualcun altro? Solo perché c'è anche lei. Puoi provare a fare i conti con questo ... Senza pathos e note alte. Non è nemmeno un dramma, sai? Come disse Carlson: "sciocchezze, la questione della vita!". Tutte queste sono le cose della vita. Spontaneo. Siamo così spesso accusati di simpatia per assassini professionisti e ogni sorta di altre vedove che simpatizzare con un impiegato o una casalinga, questa è una specie di cattiva educazione ... sì, non ti leggo la morale, toglila . Hai chiesto - ho risposto. Dai, parlami dei tuoi nuovi prodotti. Poi lo prenderò quando il "Teatro..." sarà finito. È come il vino, non si può inghiottire. Le sfumature non raggiungeranno o il retrogusto sarà imbrattato. Sarebbe imbarazzante...
Per determinare l'ambito degli strumenti di creazione grafica negli scenari web, considera le seguenti serie opzioni utilizzo della grafica:
- Le immagini statiche create da te o prese in prestito da qualche parte possono essere incorporate in una pagina HTML.
- È possibile utilizzare immagini generate in modo programmatico (HTML + CSS).
- È possibile utilizzare la libreria gd per pre-creare immagini grafiche statiche per tutte le possibili situazioni che si verificano durante l'esecuzione dello script, salvarle in file e visualizzarle per condizione.
Non considereremo l'opzione di implementare la grafica utilizzando immagini statiche a causa della sua semplicità, quindi considereremo prima un'opzione semplice (grafica HTML + CSS), quindi considereremo l'utilizzo della libreria gd in PHP.
Grafica HTML + CSS
I visitatori del sito Web hanno familiarità con i grafici a barre orizzontali con i lati colorati, che sono particolarmente comuni per illustrare i risultati dei sondaggi. A prima vista, si ha l'impressione che una specie di sussidi grafici, ma in realtà è sufficiente utilizzare alcuni semplici script:
" . $ex->getMessage() . ""; } } ?>
Modulo d'ordine
Hai ordinato:arance:Mele:
Banane:
Pomodori:
Cetrioli:
Patata:
EOT; ?>
Questo esempio non dimostra alcuna nuova funzionalità di PHP, ma mostra semplicemente un modo semplice per creare grafici utilizzando HTML e CSS (in questo caso, grafici a barre):
libreria gd
Gli strumenti grafici descritti nella sezione precedente hanno quasi esaurito le capacità del codice HTML standard (anche se vale la pena notare che non abbiamo trattato il potente generatore grafico HTML5 Canvas). Passiamo ora alla descrizione dei metodi per creare grafica veramente arbitraria utilizzando la libreria gd.
Descrizione generale della libreria gd
In generale, il set utensili gd è una libreria di codice C per creare e manipolare immagini. Questa libreria è stata originariamente sviluppata e messa a disposizione del pubblico dalle persone talentuose e generose di Boutell.com.
La stessa libreria gd non lo è programma di grafica o un programma di disegno e non è un'applicazione autonoma o GUI utente. Invece, la libreria gd fornisce funzioni che possono essere chiamate da qualsiasi programma per eseguire la manipolazione dell'immagine desiderata. Ciò significa che qualsiasi programma C che deve utilizzare il codice della libreria gd può essere collegato alla libreria gd. Questo è esattamente il problema risolto dagli sviluppatori del sistema PHP.
In effetti, è stato scritto un insieme di funzioni di interfaccia per questo scopo, che rende facile chiamare le routine gd da uno script PHP. Ma la libreria gd stessa non contiene alcun codice specifico per PHP e sono state sviluppate interfacce che consentono l'accesso alla libreria da diversi altri linguaggi e ambienti di programmazione, inclusi Perl, Pascal, Haskell e REXX.
La libreria gd ti consente di chiamare funzioni per creare immagini sorgente (inizialmente vuote, simili a un foglio di carta bianco), disegnare e disegnare all'interno di queste immagini sorgente usando vari modi e infine convertire l'immagine dal formato immagine interno di gd in un formato immagine standard, quindi inviarla alla destinazione finale (output in una finestra del browser o salvataggio in un file o database). E poiché tutte queste operazioni vengono eseguite sotto il controllo del programma e non eseguite manualmente, le immagini create possono diventare arbitrariamente complesse e dipendere da eventuali situazioni durante il corso del programma che è desiderabile renderle dipendenti.
Formati immagine
La libreria gd consente sostanzialmente di importare ed esportare immagini utilizzando un'ampia varietà di formati. I formati di immagine più popolari sono GIF, JPEG e PNG, anche se quest'ultimo di questi formati è utilizzato principalmente nei nostri esempi.
I formati GIF e PNG sono progettati per descrivere una griglia di elementi colorati corrispondenti a pixel, con alcune aggiunte. La prima aggiunta è che le celle possono contenere numeri di colore effettivi o indici in una tabella di numeri di colore. (La prima opzione crea immagini più espressive perché consente un numero qualsiasi di colori diversi, mentre l'ultima opzione crea immagini più compatte.)
La seconda aggiunta è la seguente. Naturalmente, la rappresentazione concettuale dei formati GIF e PNG è piuttosto semplice, ma in pratica la lettura, la scrittura e il trasferimento di immagini in questi formati avviene sempre in forma compressa. La compressione è necessaria perché è necessaria una grande quantità di memoria per memorizzare i dati rappresentati come una griglia di celle. Una semplice immagine di 500x400 pixel ha 200.000 pixel e se ogni pixel richiede tre byte, la quantità di memoria richiesta è già superiore a mezzo megabyte.
L'argomento della compressione è vasto e complesso, ma la maggior parte degli algoritmi di compressione si basa sulla riduzione della ridondanza dell'immagine per ridurre le dimensioni dell'immagine. (Ad esempio, occorrerebbe meno spazio di memoria per specificare che ogni pixel in un'immagine è verde piuttosto che specificare un valore verde per ogni pixel separatamente.) compiti così complessi che i metodi per risolvere questi problemi, implementati nell'algoritmo di compressione utilizzati per formare immagini in Formato GIF sono stati addirittura brevettati.
Installazione della libreria
Ad essere sinceri, il compito di installare la libreria gd e farla funzionare correttamente insieme a un sistema PHP è abbastanza difficile. Ciò non è dovuto a carenze. Software PHP o gd, ma è interamente determinato da problemi di configurazione; in particolare, è necessario capire dove dovrebbero e si trovano effettivamente le librerie gd e assicurarsi che i passaggi di compilazione e collegamento per tutti gli eseguibili siano eseguiti correttamente. Pertanto, la migliore situazione possibile è quando l'utente scopre che la libreria gd è già installata e il supporto gd è già abilitato nel sistema PHP (per gentile concessione della società di web hosting o perché la libreria è inclusa nel sistema PHP installato).
Pertanto, l'installazione della libreria gd deve iniziare dal punto zero, controllando se la libreria gd è già stata installata. Innanzitutto, inserisci il seguente codice nel tuo file di script e visualizza i risultati dell'esecuzione in un browser, indipendentemente dal fatto che i tuoi script siano supportati da una società di web hosting o interamente dalla tua installazione:
Dopo aver visualizzato questa pagina sullo schermo, è sufficiente cercare la stringa di testo "gd" nella finestra del browser. Ciò dovrebbe risultare in una sottosezione che descrive fino a che punto la tua installazione PHP è autorizzata a supportare la libreria gd. Se intendi eseguire il rendering solo di immagini di determinati tipi (ad esempio, formato PNG) ei risultati della funzione phpinfo() indicano che il supporto per questo tipo di immagine è consentito, puoi metterti subito al lavoro. E se i dati della versione gd includono la parola "bundled", viene utilizzata la libreria gd fornita con PHP.
Se il tentativo di trovare la menzione della libreria gd fallisce e stai eseguendo tu stesso l'installazione di PHP, puoi installare e configurare la libreria gd. (D'altra parte, se la tua società di hosting gestisce l'installazione di PHP, tutto ciò che devi fare è chiedere a tale società di fornire supporto per la libreria gd o utilizzare un'altra società di web hosting.)
L'utilizzo della libreria gd fornita con PHP elimina molti dei problemi associati all'installazione di gd, ma non tutti. Il fatto è che l'utilizzo della versione inclusa nel pacchetto di distribuzione stesso consente di ottenere la libreria gd, ma non necessariamente tutte le librerie necessarie per il funzionamento di gd. La stessa libreria gd dipende da molte altre librerie: libpng (per manipolare le immagini PNG), zlib (usata per la compressione) e jpeg-6b o successiva (per manipolare le immagini PNG). Immagini JPEG, se necessario). Le librerie specificate sono già presenti in molte installazioni Linux, nel qual caso potrebbe essere sufficiente includere l'opzione with richiesta (come --with-zlib) nei parametri senza specificare la directory di installazione. Se stai eseguendo tu stesso la configurazione PHP, aggiungere l'opzione --with-gd è sufficiente per garantire che la versione in bundle di gd sia inclusa nell'eseguibile. E se vuoi puntare a una versione diversa, usa invece l'opzione --with-gd=path.
Se ne trovi uno o più mancanti librerie richieste, ciò significa che queste librerie dovranno essere generate separatamente. Per informazioni su dove trovarlo versioni attuali, puoi iniziare guardando la documentazione disponibile su www.libgd.org.
Principi di base per lavorare con la libreria gd
Quando un'immagine viene creata o manipolata con il toolkit gd, l'immagine viene rappresentata in uno speciale formato gd che non corrisponde a nessun tipo di immagine convenzionale. È teoricamente possibile esportare immagini in questo formato gd, ma tale operazione è raramente utilizzata, poiché l'immagine risultante non è compressa e non può essere visualizzata in un browser o in un semplice programma di grafica.
Un'immagine elaborata utilizzando il toolkit gd è caratterizzata da informazioni sulla larghezza, l'altezza e il colore di tutti i pixel, il cui numero è uguale al prodotto della larghezza e dell'altezza. In genere, un programma inizia la sua interazione con la libreria gd creando una nuova immagine vuota (su cui disegnare e disegnare) o importando un'immagine da un file. I seguenti passaggi di solito si svolgono nei seguenti passaggi: in primo luogo, la distribuzione dei colori nell'immagine, in secondo luogo, il disegno e la pittura o la manipolazione dell'immagine utilizzando alcune altre operazioni, in terzo luogo, la conversione dell'immagine in un formato comune (ad esempio, PNG o JPEG ) e trasferiscilo nella destinazione.
Rappresentazione dei colori
Esistono due modi per rappresentare i colori nelle immagini gd: rappresentazione basata sulla tavolozza, che è limitata a 256 colori, e rappresentazione realistica dei colori, che consente di specificare importo arbitrario diversi numeri di colore RGB. In gd 1.x, l'unica opzione era usare i colori tavolozza, ma nella libreria gd 2.x e nella versione di quella libreria fornita con PHP, è supportata la possibilità di creare immagini a colori sia tavolozza che realistiche. Si noti che ogni particolare immagine gd deve essere basata su palette o true-to-color (RGB); questo significa che non c'è modo di iniettare colori realistici nelle immagini con tavolozza.
Per ottenere l'immagine vuota basata sulla tavolozza originale, è necessario chiamare la funzione ImmagineCrea() e il giorno in cui l'immagine viene ottenuta con colori realistici, viene utilizzata la funzione ImageCreateTrueColor().
Immagini basate sulla tavolozza
I colori sono specificati nel formato Rosso-Verde-Blu (RGB), utilizzando tre numeri da 0 a 255. Ad esempio, il colore specificato dai numeri (255, 0, 0) è rosso vivo, il colore ( 0, 255, 0) è verde, il colore (0, 0, 255) è blu, il colore (0, 0, 0) è nero, il colore (255, 255, 255) è bianco e il colore (127, 127, 127) è grigio. Creando sempre più nuovi colori, puoi scegliere arbitrariamente i valori delle tre componenti di colore.
Qualsiasi pittura su un'immagine deve essere eseguita con un colore specifico e i colori devono essere distribuiti nell'immagine prima di essere utilizzati. Inoltre, il primo colore distribuito nell'immagine diventa automaticamente il colore di sfondo. Quindi, in nessun caso puoi pensare di poter fare a meno di specificare i colori, e di solito l'operazione di distribuzione dei colori diventa la prima operazione dopo aver creato una nuova immagine vuota.
I colori nelle immagini con tavolozza vengono creati utilizzando la funzione imagecolorallocate(), che prende come parametri un'immagine (creata in precedenza) e tre numeri interi che specificano la percentuale di rosso, verde e blu. Il valore restituito è un numero intero che specifica l'indice del nuovo colore nella tavolozza interna dell'immagine. Questo valore restituito deve essere assegnato a una variabile perché il valore di indice specificato è necessario per tutte le operazioni future da eseguire utilizzando il colore specificato.
Le immagini basate su tavolozza possono avere un massimo di 256 colori (il lettore potrebbe essere interessato o meno a ciò su cui si basano tali immagini, ma ogni pixel in un'immagine basata su tavolozza è in realtà un singolo byte che memorizza l'indice di un elemento nella tavolozza di 256 colori.)
Si noti che l'indice restituito quando si distribuisce uno dei colori in un'immagine è significativo solo per quell'immagine. Ad esempio, se in uno script PHP alla variabile $black viene assegnato un colore distribuito in un'immagine, non ha senso utilizzare questa variabile come input di colore per un comando di disegno chiamato per elaborare un'altra immagine.
Immagini con colori realistici
La libreria gd 2.0 e successive fornisce anche la possibilità di creare immagini senza tavolozza in cui ogni pixel memorizza un numero arbitrario Colori RGB. In questo cosiddetto formato di colore realistico, il numero di colori possibili è estremamente elevato. Questa possibilità non solo espande all'infinito la portata dell'autoespressione artistica, ma consente anche di riprodursi in modo affidabile Immagini PNG e JPEG con colori realistici, caricati in memoria utilizzando il toolkit gd.
Ad eccezione del fatto che viene utilizzata una funzione diversa per creare l'immagine originale e non ci sono restrizioni sulla selezione di colori diversi, i principi per lavorare con immagini con colori realistici sono simili a quelli per le immagini basate sulla tavolozza.
In particolare, è ancora possibile chiamare la funzione ImageColorAllocate() per creare nuovi colori e impostare il valore restituito su una variabile da utilizzare successivamente nei comandi di disegno. L'unica differenza è che il valore restituito è il numero del colore RGB, non l'indice dell'elemento nella tavolozza. Inoltre, nelle immagini a colori realistiche, non esiste il concetto di colore di sfondo creato come effetto collaterale della funzione ImageColorAllocate(); come risultato dell'inizializzazione, a tutti i pixel viene assegnata una designazione nera (0, 0, 0).
Trasparenza
Le versioni di gd 2.x supportano il concetto di trasparenza. Questo utilizza un canale alfa (oltre ai valori rosso, verde e blu) che indica quanto è trasparente il colore. Ciò consente, ad esempio, di sovrapporre una forma all'altra in modo tale che la prima forma rimanga parzialmente visibile, anziché sovrapporsi completamente alla seconda.
In PHP, molte funzioni immagine hanno un equivalente che contiene la parola "alpha" nel nome, che indica che in queste funzioni il colore è rappresentato da quattro valori (R,G,B,A). Ad esempio, la funzione imageColorAllocate() accetta tre parametri e quando la funzione viene chiamata ImageColorAllocateAlpha()è necessario specificare un quarto parametro con un valore compreso tra 0 e 127. Un valore pari a zero indica che il colore è completamente opaco e un valore pari a 127 indica che il colore è completamente trasparente.
Coordinate e comandi di disegno
Dopo aver creato un'immagine utilizzando il toolkit gd, viene formato implicitamente un sistema di coordinate, che consente di impostare i comandi di disegno al suo interno. Vengono determinati i valori limite delle coordinate in questo sistema parametri dati larghezza e altezza dell'immagine.
L'origine delle coordinate in questo sistema, corrispondente alle coordinate (0, 0), si trova nell'angolo in alto a sinistra dell'immagine. La direzione positiva per i valori X è da sinistra a destra e per i valori Y è dall'alto verso il basso. (Nei sistemi di coordinate grafica computerizzata questa posizione dell'origine è comune, ma coloro che hanno studiato la geometria analitica sembrano essere abituati al fatto che l'origine è nell'angolo in basso a sinistra del diagramma.)
Il numero di comandi di disegno è molto grande. Questi comandi includono, ma non sono limitati a, comandi per disegnare segmenti di linea, rettangoli e archi, nonché comandi per l'impostazione di valori di pixel specifici. Ma tieni presente che il risultato finale di tutti questi comandi di disegno e disegno è l'assegnazione dei valori dei pixel. Dopo aver eseguito i comandi che modificano i valori dei pixel, non rimangono tracce in memoria (ad eccezione dei valori modificati stessi), quindi non è possibile annullare l'effetto del disegno e dei comandi di disegno o presentare separatamente i risultati dei diversi comandi.
Nulla impedisce di disegnare comandi che si estendono oltre l'immagine specificata, ma tale disegno non ha alcun effetto visibile. Ad esempio, l'immagine non mostrerà un rettangolo le cui coordinate sono tutte negative.
Conversione di formato
Tutte le operazioni di disegno e manipolazione delle immagini vengono eseguite sull'immagine rappresentata nel formato interno di gd. E dopo che queste operazioni sono state completate, uno dei comandi di conversione e output (imagepng, imagetjpeg, ecc.) può essere chiamato nello script per convertire questa immagine nel formato grafico richiesto e inviarla alla finestra del browser dell'utente (o a un file ).
Rilasciare risorse
Dopo che il risultato della trasformazione dell'immagine finita gd è stato trasferito all'utente, possiamo considerare che il lavoro con la versione interna è terminato. Significa che questa versione deve essere distrutto. Il modo giusto eseguire tale operazione consiste nel chiamare la funzione distruzione immagine() con un'immagine come parametro.
funzioni della libreria gd
Non enumereremo e descriveremo separatamente in questo articolo tutte le funzioni fornite nell'interfaccia gd dell'interprete PHP. Per familiarizzare con queste informazioni, si consiglia di utilizzare la sezione "Elaborazione e generazione di immagini" del manuale di php.net. La maggior parte delle funzioni gd rientra in una delle categorie mostrate nella tabella sottostante. Nota che i nomi delle funzioni elencati in questa tabella hanno la prima lettera di ogni parola in maiuscolo per leggibilità, ma questo non è sempre il caso negli esempi di codice perché i nomi Funzioni PHP senza distinzione tra maiuscole e minuscole:
Classificazione delle funzioni gd
Tipo | Esempio | Nota |
---|---|---|
Funzioni di creazione di immagini | ImageCreate(), ImageCreateTruecolor(), ImageCreateFromGd(), ImageCreateFromJpeg() | Restituisce una nuova immagine gd. La funzione ImageCreate() prende come parametri la larghezza e l'altezza dell'immagine, mentre i parametri di altre funzioni sono un percorso file, un URL o una stringa contenente un'immagine precedentemente creata da caricare e convertire in formato gd |
Funzioni che eseguono operazioni di distribuzione del colore | ImageColorAllocate(), ImageColorAllocateAlpha(), ImageColorDeallocate() | La funzione ImageColorAllocate() accetta un handle di immagine e i valori di colore rosso, verde e blu richiesti come parametri, quindi restituisce un numero di colore da utilizzare successivamente nelle operazioni di disegno e disegno. La funzione ImageColorAllocateAlpha accetta un parametro aggiuntivo: coefficiente di trasparenza (0-127) |
Funzioni che eseguono operazioni di corrispondenza dei colori | ImageColorClosest(), ImageColorClosestAlpha(), ImageColorExact(), ImageColorExactAlpha() | Restituisce l'indice del colore corrispondente nell'immagine con tavolozza. Le funzioni che contengono la parola "Closest" nei loro nomi restituiscono il colore corrispondente più vicino (l'accuratezza della corrispondenza viene misurata come distanza tra i punti nello spazio dei valori RGB); le funzioni etichettate "Exact" restituiscono il numero del colore solo se è identico a quello cercato, altrimenti restituiscono -1, le funzioni etichettate "Alpha" operano sui colori che vengono definiti utilizzando quattro valori (con colori trasparenti) |
Funzioni di disegno al tratto | ImageLine(), ImageDashedLine(), ImageRectangle(), ImagePolygon(), ImageEllipse(), ImageArc() | Utilizzato per disegnare segmenti di linea o curve di una forma specificata. Di solito il primo parametro di ciascuna di queste funzioni è l'immagine, l'ultimo parametro è il colore ei parametri intermedi sono le coordinate X e Y. |
Funzioni di impostazione della penna per disegnare linee | ImageSetStyle(), ImageSetThickness() | Modificare le impostazioni che influenzano le caratteristiche delle linee create dai successivi comandi di disegno della linea (alcune di queste funzioni si applicano solo a gd 2.0.1 o successivo) |
Funzioni di disegno e riempimento | ImageFilledRectangle(), ImageFilledEllipse(), ImageFilledPolygon(), ImageFilledArc(), ImageFill() | Di norma, sono simili alle corrispondenti funzioni per disegnare linee, ma provvedono non solo a disegnare i contorni delle aree, ma anche a riempire di colore le aree create. La funzione speciale ImageFill() esegue un'operazione di riempimento con un riempimento, per cui il colore specificato riempie. Il riempimento viene eseguito in tutte le direzioni, a partire dal punto XY specificato (alcune di queste funzioni richiedono gd 2.0.1 o successivo) |
Funzioni per lavorare con il testo | ImageString(), ImageLoadFont() | La funzione ImageString accetta come parametri un handle di immagine, un numero di font, coordinate x e y, una stringa di testo e un colore. Se il numero del carattere è compreso tra 1 e 5, viene utilizzato uno dei cinque caratteri incorporati per visualizzare la linea in quel colore. D'altra parte, un numero di carattere maggiore di 5 indica il risultato del caricamento di un carattere personalizzato utilizzando la funzione ImageLoadFont(). |
Funzioni di esportazione | ImmaginePng(), ImmagineJpeg() | Converti l'immagine interna di gd in un'immagine del formato appropriato, quindi invia questa immagine al flusso di output. Se viene fornito un solo parametro (descrittore dell'immagine), l'immagine viene riproposta all'utente e durante l'utilizzo parametro aggiuntivo, che è il percorso del file, la destinazione del flusso di output è il file |
Funzione di distruzione dell'immagine | ImageDestroy() | Accetta un handle di immagine come parametro e rilascia tutte le risorse associate all'immagine |
Supporto per i trasferimenti di immagini HTTP
Affinché un'immagine venga visualizzata correttamente nel browser dell'utente, è necessario specificare da dove deve provenire l'immagine e qual è il suo formato. Pertanto, sfortunatamente, non è possibile semplicemente iniettare, ad esempio, chiamando la funzione imageToPng() in file creato HTML e quindi risolvere il problema della visualizzazione di un'immagine. In sostanza, devi intercalare il codice di output dell'immagine con il codice HTML generato nello script PHP e puoi utilizzare una delle tre opzioni descritte di seguito per farlo.
Creazione di immagini a pagina intera
L'intera pagina generata può essere incorniciata come immagine. In questo caso, è necessario passare un'intestazione HTTP che precede i dati dell'immagine e quindi dichiarare che segue un'immagine di un tipo particolare. Ad esempio, le seguenti righe potrebbero essere fornite alla fine dello script:
// ... codice che crea un'immagine e assegna // alla variabile $image header("Content-type: image/png"); // Visualizza il titolo nel browser imagepng($image); // Passa i dati dell'immagine stessa convertita in PNG imagedestroy($image); // Risorse gratuite
Il vantaggio di questo approccio è che qualsiasi informazione, inclusi i parametri POST, può essere utilizzata per trasmettere istruzioni sulla composizione dell'immagine futura. E il suo svantaggio è che la pagina risultante non può contenere alcun normale codice HTML. In effetti, devi anche fare attenzione a non inviare alcun output di testo prima del titolo e dell'immagine negli script, poiché ciò equivale a inviare il contenuto prematuramente. In questo caso viene visualizzato il messaggio di errore "Intestazioni già inviate...".
Incorporamento di immagini memorizzate in file
Prima di tutto, notiamo che in Linguaggio HTML maniglia supportata , che consente di incorporare un'immagine specificando un percorso o un URL del file immagine, come nell'esempio seguente:
Questo costrutto si applica ai file di immagine statici, ma non c'è motivo per cui non possa essere utilizzato per iniettare un'immagine appena creata. Pertanto, è possibile preparare uno scenario in cui l'immagine viene prima creata, quindi i dati dell'immagine vengono scritti in un file locale, dopodiché viene generato il codice HTML con il descrittore appropriato indicando solo cos dato file.
Gli unici svantaggi di questo approccio sono che, in primo luogo, devi includere le operazioni di scrittura dei file nel processo di creazione della pagina, che può richiedere molto tempo, e in secondo luogo, devi capire cosa fare con i file quando sono finiti .
Ma in determinate situazioni, questo approccio è l'ideale. Riguarda sulla creazione e la memorizzazione nella cache di immagini che rappresentano un insieme finito di scelte. In questo caso esiste un certo modo di associare una particolare situazione al nome di un file immagine. Quando si verificano alcune di queste situazioni che richiedono l'output di un'immagine, controlla se il file corrispondente esiste già. In caso di risposta positiva, viene semplicemente applicato un collegamento a questo file, formattato come descrittore. , e se la risposta è negativa, viene creata un'immagine, scritta in un file, e quindi viene nuovamente applicato un collegamento a questa immagine. In definitiva, la formazione di nuovi file semplicemente non sarà richiesta.
Incorporamento di immagini generate negli script
Infine, non vi è alcun motivo per cui non sia possibile fornire uno script di imaging offline e quindi incorporare l'immagine risultante in pagina dinamica creato da un altro script, specificando nel descrittore L'URL di questo script. In questo caso, l'unica difficoltà è scegliere come passare i dati necessari alla pagina dipendente. Ad esempio, un descrittore che indica un'immagine incorporata potrebbe avere il seguente aspetto:
In questo caso, lo script ballpage.php restituisce immagini PNG di palline colorate in varie posizioni nel disegno.
Tuttavia, quando si utilizza questo approccio, possono verificarsi problemi di prestazioni, poiché i server Web e i browser a volte controllano i suffissi dei file in elaborazione e, dopo aver ricevuto i risultati del controllo, reagiscono in modi diversi. Ad esempio, allo script di rendering ballpage potrebbe essere necessario assegnare un'estensione .php affinché Apache possa determinare che il codice del server fornito deve essere interpretato come codice PHP (sebbene la modalità di elaborazione richiesta possa essere impostata anche utilizzando i file di configurazione).
Tuttavia, esistono alcune versioni non standard di browser che non tengono conto della possibilità che un file .php generi un'immagine, anche se l'intestazione passata indica che segue un'immagine. Pertanto, quando si utilizza il metodo specificato, è necessario archiviare gli script diversi browser e assicurati che il pubblico previsto di utenti riceva le pagine nel modo che intendevi.
Di seguito sono riportati esempi di utilizzo della libreria gd per creare immagini.
Un esempio di utilizzo della libreria gd: creazione di forme semplici
Nell'esempio seguente, mostreremo come generare un disegno contenente forme geometriche semplici utilizzando la libreria gd:
Un esempio di utilizzo della libreria gd: immagini frattali
Esiste già una meravigliosa tradizione di abbellire la presentazione del tema del disegno delle linee, che in linea di principio può sembrare poco interessante, usando i frattali come esempio. L'esempio seguente non solo mostra come creare a livello di codice un'immagine complessa, ma serve anche come buona dimostrazione della potenza del linguaggio PHP. Il fatto è che gli array e i tipi di dati non strettamente definiti di questo linguaggio rendono molto facile creare strutture di dati complesse corrispondenti a immagini frattali senza utilizzare un gran numero di dichiarazioni.
Un frattale è una forma geometrica simile a se stessa. Ciò significa che parti di un frattale hanno una forma simile all'intero frattale, anche parti di queste parti hanno una forma simile e così via.
Teoricamente, un frattale ideale può essere aumentato un numero illimitato di volte e creare parti sempre più piccole, pur continuando a rilevare la ripetizione degli stessi schemi. Ma in pratica, i frattali generati dal computer degenerano in forme non frattali, come normali segmenti di linee curve e rette, dopo aver utilizzato un numero limitato di operazioni di modellazione delle parti.
Un esempio di questo tipo di immagine che cercheremo di creare è mostrato nella figura sottostante:
Certo, a prima vista si ha l'impressione di una curva continua, ma questa immagine è semplicemente una raccolta di un gran numero di piccoli segmenti di linea, le cui estremità sono collegate sotto forma di una linea spezzata chiusa.
Il nostro compito è calcolare le coordinate dei punti finali di tutti questi segmenti di linea e quindi rappresentare correttamente tutti i segmenti come un'immagine PNG. Potremmo semplicemente assemblare un frammento di un'immagine frattale, ma abbiamo deciso di porci un compito più difficile: non solo garantire l'output di un'immagine frattale, ma anche formare una piccola infrastruttura che renda facile variare i parametri frattali e creare immagini di nuovi tipi.
Per cominciare, prepareremo alcune strutture dati che ci permettono di rappresentare forme complesse visualizzabili. Tali strutture dati dovrebbero fornire non solo calcoli intermedi, ma anche il disegno di segmenti, la cui posizione e lunghezza sono determinate dai risultati finali ottenuti. Innanzitutto, facciamo alcune ipotesi piuttosto arbitrarie:
- un punto nel sistema di coordinate è dato da una coppia di numeri;
- il percorso è rappresentato come un elenco di punti.
In definitiva, per disegnare una polilinea, è necessario tracciare segmenti di linea retta tra tutti i punti della linea. Se fosse necessario disegnare un singolo segmento di linea, allora questo compito potrebbe essere immaginato come disegnare una polilinea che passa attraverso due punti, e disegnare un rettangolo potrebbe essere immaginato come creare un'immagine di una linea spezzata che passa attraverso cinque punti (tenendo conto che il punto iniziale ricorre due volte in una linea spezzata e chiude il rettangolo quando riappare). (In questo caso, si potrebbe considerare un segmento di linea retta come un oggetto primitivo, ma, a quanto pare, quando si risolve il problema della creazione di immagini frattali, la rappresentazione sotto forma di una linea spezzata è più concisa.)
Consideriamo ora la questione di come dovrebbero essere rappresentati punti e polilinee. Il modo più semplice per rappresentare elenchi di oggetti è in PHP utilizzando gli array. Pertanto, prendiamo come base che un punto sia un array che include due numeri e una polilinea sia un array che include una serie di punti. Come risultato di questo approccio, dovrebbero essere create strutture che sono array PHP multidimensionali, ma se possiamo definire un costruttore e funzioni di accesso con nomi facili da ricordare, allora possiamo dimenticare quanto siano complesse queste strutture e sviluppare semplicemente il codice usando tali operazioni, come se queste strutture fossero tipi di dati reali.
Di seguito è riportato il codice per la creazione dell'immagine mostrata nella figura sopra. Definisce i tipi di dati in termini delle loro funzioni di creazione (i cui nomi iniziano con il prefisso make ), funzioni per accedere ai componenti delle strutture dati e funzioni per visualizzare un'immagine basata sui dati (i nomi di queste funzioni iniziano con il prefisso display). Con questo approccio, i punti non vengono emessi sullo schermo, quindi non ci sono funzioni di output per essi e le polilinee vengono disegnate disegnando segmenti di linea tra coppie successive di punti.
La funzione transform_path() prende come primo parametro la definizione di polilinea originale e come secondo parametro il nome di una funzione che prende come parametro la definizione di polilinea e restituisce come risultato la definizione di polilinea trasformata. Il terzo parametro della funzione transform_path() è la molteplicità dell'applicazione successiva di questa funzione per trasformare una polilinea in un'altra per creare una nuova polilinea. Il motivo per cui si è rivelato utile introdurre una tale funzione di secondo ordine è che altrimenti potrebbe essere necessario creare sempre più funzioni di looping ogni volta che è necessario generare un nuovo frattale. L'utilizzo di questo approccio consente di collegare diverse parti del codice di generazione frattale in una funzione separata che può essere passata alla funzione transform_path() ed evitare la duplicazione del lavoro.
La funzione spike accetta una definizione di polilinea come parametro e restituisce un'altra definizione di polilinea in cui ogni segmento di linea che passa attraverso due punti viene sostituito da una polilinea che passa attraverso cinque punti con un picco nel mezzo. E la funzione top-hat esegue un'azione simile, tranne per il fatto che la polilinea risultante passa attraverso sei punti e il picco risultante ha una forma rettangolare. Inoltre, questo esempio include molte altre funzioni per la creazione di polilinee con dimensioni standard, in cui gli angoli tra i segmenti sono retti; queste funzioni devono essere utilizzate come esempi rappresentativi.
Dopo aver caricato le definizioni di tutte le funzioni dai file di inclusione, questo codice crea un'immagine gd con l'altezza e la larghezza specificate, quindi i colori vengono distribuiti in questa immagine. (Lo sfondo è bianco e i segmenti di linea sono neri.)
L'esecuzione del codice di imaging frattale inizia con la creazione di una polilinea rettangolare chiusa standard passante per cinque punti e quindi comprendente quattro segmenti di linea (implicitamente specificati). Questa definizione di polilinea viene quindi passata alla funzione transform_path() come chiamata a questa funzione con parametri che indicano che la definizione di polilinea deve essere restituita, che è il risultato dell'applicazione della funzione spike() al rettangolo dato quattro volte. La trasformazione di una polilinea rettangolare chiusa inizia con l'elaborazione di quattro segmenti di linea e ogni segmento viene sostituito da quattro segmenti. Pertanto, come risultato di quattro iterazioni successive, si formano rispettivamente 16, 64, 256 e 1024 segmenti.
Dopodiché, resta solo da visualizzare sullo schermo la complessa polilinea chiusa formata. Per disegnare tutti i segmenti di linea sull'immagine, viene chiamata la funzione display_path() definita in questo codice, viene passata un'intestazione HTTP che indica che segue un'immagine PNG, viene chiamata la funzione imagepng() per la conversione e la visualizzazione, quindi viene chiamata la funzione gd interna la definizione dell'immagine viene distrutta:
Queste immagini possono richiedere molto tempo per la generazione e il rendering e il tempo aumenta con l'aumentare del numero di segmenti di linea creati, pertanto il server Web potrebbe eseguire il timeout dello script prima che l'immagine sia terminata. Per uscire da questa situazione, puoi ridurre il numero di passaggi di generazione nel codice di creazione dell'immagine frattale o aumentare i valori di timeout nei file di configurazione del server Web o dell'interprete PHP.
Naturalmente, sperimentare il codice per creare immagini frattali confina con l'arte e gli umili autori di questo articolo non si considerano artisti veramente talentuosi. Ma possiamo augurare ai lettori il successo nel migliorare tali immagini.
Nella maggior parte dei casi, la rappresentazione grafica dei dati è la più appropriata in una data situazione. Se anche i diagrammi sono interattivi, allora è assolutamente fantastico! Ciò che intendo? Facendo clic su un elemento del grafico si aprirà un altro grafico.
Cosa sono i diagrammi collegati?
Finora tali grafici corrispondevano a un solo flusso di dati e non erano completamente interconnessi. E se creassimo diagrammi che possiamo spostare avanti e indietro? Tali grafici sono chiamati grafici connessi e fanno parte del nuovo pacchetto FusionCharts 3.2, che consente di creare grafici multilivello estraendo i dati da un'unica fonte. In tali diagrammi, tutto è interconnesso.
In questo tutorial, esamineremo l'integrazione di tali diagrammi in un piccolo progetto. Il database MySQL conterrà i dati, PHP fungerà da collante che crea il file XML, FusionCharts prenderà quel file e produrrà i dati.
Qualche parola sui diagrammi collegati:
- Per impostazione predefinita, un grafico figlio ha lo stesso tipo di visualizzazione (grafici a barre, ad esempio) del genitore;
- È possibile aggiungere ulteriori impostazioni a qualsiasi livello della gerarchia, incluso il tipo di grafico stesso;
- I grafici possono essere inseriti in contenitori HTML, finestre di dialogo jQuey, lightbox, finestre extJS, ecc.;
- Supporto per eventi tramite JavaScript;
Cosa vogliamo fare?
Molte volte ci siamo trovati di fronte al compito di monitorare la crescita dei visitatori dei nostri siti. Creiamo quindi un piccolo progetto che mostrerà il numero di utenti registrati per mese/giorno/ora, o in altre parole, il numero di utenti registrati sul nostro sito per un certo periodo di tempo.
Requisiti:
- Qualsiasi server web con PHP;
- server MySQL con database;
- FusionCharts, che puoi scaricare o acquistare dal loro sito web;
Passaggio 0. Preparazione
Crea un database vuoto chiamato fctutorialc.
Crea una cartella vuota chiamata fcdemo nella root del tuo server web (di solito www)
Passaggio 1. Preparare il database
Per semplificare le cose, utilizzeremo solo una tabella, utenti, che visualizzerà le informazioni dell'utente. Siamo interessati solo al momento della registrazione degli utenti. Quindi la nostra tabella conterrà solo queste informazioni. Incolla questo codice in phpMyAdmin:
CREATE TABLE `users` (`ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `Time` timestamp NOT NULL DEFAULT "0000-00-00 00:00:00", PRIMARY KEY (`ID`), KEY `Time` (`Tempo`))
Abbiamo creato una tabella contenente 2 campi: ID e ora. time conterrà informazioni sull'ora di registrazione dell'utente. Si noti che abbiamo inserito un indice in questo campo perché useremo un insieme di condizioni WHERE. L'indice ci consentirà di accelerare il processo di campionamento.
Collegamento alla base
Scriviamo un piccolo script per connetterci al database:
Sostituisci le impostazioni con le tue e salva questo file come connect-to-database.php nella cartella fcdemo.
Inserisci dati casuali
Se questo fosse un vero progetto, allora la tabella degli utenti verrebbe riempita nel tempo, ma per la dimostrazione abbiamo bisogno di inserire alcuni dati. Scriviamo un piccolo script che inserirà dati casuali in una tabella. Non preoccuparti se non capisci il codice seguente: non è importante per questo tutorial.
Salva questo file come generate-random-data.php tutto nella stessa cartella.
Per prima cosa includiamo il file di connessione al database. Quindi impostiamo l'intervallo di tempo da cui verrà selezionato in modo casuale il tempo per la registrazione dell'utente. È possibile modificare il numero di righe da inserire. Per fare ciò, devi modificare la variabile $RecordsToInsert.
Quindi eseguiamo lo script per inserire i record generati nel database. Per avviare questo processo vai a questo indirizzo: http://localhost/fcdemo/generate-random-data.php.
Alla fine dovresti vedere un messaggio: "Record inseriti ($RecordsToInsert)"
Passaggio 2. Preparazione dello scheletro del sito
Dobbiamo creare il massimo pagina semplice per visualizzare il nostro grafico. Qualcosa come questo: