Newsgroup: it.comp.www.php
Titolo: info GD2

Ciao, domando perché non so se si può fare e se sì in che modo.
Supponiamo che io abbia sul server una immagine (GIF o PNG) che sia di 
un unico colore nella parte in cui non è trasparente. Dunque, l'immagine 
è ad esempio verde e ha lo sfondo trasparente, bianca con sfondo 
trasparente ecc.ecc.
La caratteristica dell'immagine in questione è insomma quella di essere 
bicolore: trasparente+un colore.
Ora: è possibile con le GD2 (senza ImageMagick) ricolorare di un colore 
a mia scelta la porzione non trasparente dell'immagine? E, se sì, in che 
modo? E con quale costo in termini di tempo e prestazioni?
Grazie a tutti!   :-)

 modo? E con quale costo in termini di tempo e prestazioni?
Teoricamente ti basta caricare l'immagine con imageloadfrom*(), quindi 
impostare il colore con imagecolorset() e salvarla con image*()
Dico teoricamente sia perche` non l'ho mai fatto, sia perche` se funziona, 
lo fa solo con immagini indexed (quindi gif e png fino a 256 colori).
Bye.

j2them ha scritto:

nelle immagini con palette ad indice (tipo le gif) la trasparenza viene 
assegnata ad un colore: tutti i pixel che hanno quel colore risultano 
trasparenti. quindi dovresti catturare il colore trasparente e 
riassegnarlo all'immagine che rendi in output. per colorare la parte non 
trasparente puoi andare di imagefilltoborder() (se la porzione di colore 
diverso da trasparente è unica ed e sono note le coordinate di almeno un 
pixel interno all'area - comunque sono ricavabili) oppure fai una 
sostituzione pixel a pixel, controllandone il colore.
Guarda questo intervento che credo possa aiutare
http://it.php.net/manual/it/function.imagecopy.php#27287

 lo fa solo con immagini indexed (quindi gif e png fino a 256 colori).
ok, grazie

 
http://it.php.net/manual/it/function.imagecopy.php#27287
ok, grazie!

 
http://www.php.net/manual/it/function.imageloadfont.php
no, ti riferisci a qualcos'altro, questa funzione sembrerebbe relativa 
ai font. Solo che nella colonna sinistra della guida non trovo la 
funzione che mi hai indicato

 Teoricamente ti basta caricare l'immagine con imageloadfrom*()
http://www.php.net/manual/it/function.imagecreatefrompng.php
 ?

 imagefilltoborder() 
Molto interessante questo esempio:
Image: 
http://henrik.nyh.se/dump/map/europe.gif
In action: 
http://henrik.nyh.se/dump/map/map.html
Source:
<?php
$map = "europe.gif";
$img = ImageCreateFromGIF($map);
// Colors
$border = ImageColorAt ($img, 416, 111);  // Get color of borders - 
apparently (0,0,0) won't work
$red = ImageColorAllocate($img, 255, 0, 0);
$green = ImageColorAllocate($img, 0, 255, 0);
// Fill
ImageFillToBorder($img, 440, 100, $border, $red);  // Sweden
ImageFillToBorder($img, 250, 290, $border, $green);  // Great Britain
// Output image as PNG
header("Content-type: image/png");
ImagePNG($img);
ImageDestroy($img);  // Free memoryu
?>

 
http://www.php.net/manual/it/function.imageloadfont.php
http://it.php.net/imagecreatefromgif
http://it.php.net/imagecreatefromjpeg
[e tutte le altre altre from*]
-- 
ValeRyo - GS500F "Camilla"
Comitato Per La Salvaguardia Dell'Italiano
E anche tu potrai dire: quest'hanno c'è l'ho l'iscrizione!
Se impareremmo i congiuntivi fossimo persone migliori! 

In action: 
http://henrik.nyh.se/dump/map/map.html
Gia', ma ci vuole una mappa sistemata ammodo. Provaci un po' con la
Norvegia... ;-)
Leonardo
--
The stars have not dealt me the worst they could do:
My pleasures are plenty - my troubles are two.
But oh!, my two troubles, they reave me of rest:

 Norvegia... ;-)
è vero, basta un punto "aperto" e il colore si propaga al di fuori del 
bordo. Inoltre, se proprio devi riempire una regione, chiaremnte se 
colori lo stivale, ti saltano la Sicilia e la Sardegna come minimo!
   :-)
Una cosa che non ho provato è se posso avere lo stesso colore per bordo 
e riempimento. In mancanza di tempo, senza provare e poiché mi è 
sembrato comunque che per il mio progetto potesse andare, ho dotato le 
mie forme di bordi di un colore differente.

mie forme di bordi di un colore differente.
Io mi trovo bene con una mappa in cui ogni zona ha un colore di indice
differente: 
http://alnitak.ctt.it/lserni/italia.php?pv=KR,LC,BG
Un bell'ImageColorSet($gd, $indice['provincia'], 255, 255, 0); ed ecco
una zona di forma complessissima diventare istantaneamente gialla.


 differente: 
http://alnitak.ctt.it/lserni/italia.php?pv=KR,LC,BG
sti' fiorentini non c'e' verso di eliminarli ? ;)


wrote:



BWAHAHAHAHAHA tifenteremo patroni ti tutto monto!
Seriamente, se ti serve la mappa con i colori indicizzati, bisogna te la
mandi in PNG.


 mandi in PNG.
grazie per il pensiero, ma non era per 'soffiartela', non sapevo se era 
un errore o meno, comunque terro' conto della tua gentilezza :)
ciao
 

un errore o meno
No no, e' intenzionale e documentato su Internčt :-)
In casi come questi distribuisco demo evidentemente NON funzionanti, e la
versione funzionante solo di persona; onde evitare di dovermi trasformare
in un help desk per sconosciuti.
Quanto al soffiarmela non c'e' problema... io stesso la presi non ricordo
piu' dove, ripulendo un po' i pixel a manina e riempiendo i colori con il
flood fill; venti minuti di lavoro, capirai la roba. Restituisco al mondo
un po' di quel che ho preso :-D
Leonardo "cosi' mi sento la coscienza a posto al prossimo sgraffigno"


 la mandi in PNG.
Uhm... chiedo troppo se chiedo di mandarla anche a me?
Al momento non dovrebbe servirmi, ma non si sa mai :-)
Ma j2them non ci ha fatto più sapere se ha risolto il problema
delle immagini ridimensionate a nero: io ho avuto problemi
del genere ma solo con immagini con alpha channel.


Al momento non dovrebbe servirmi, ma non si sa mai :-)
Tanto non e' che occupi molto spazio. "italia1744.png" (non chiedermi
perche' 1744: aveva un senso, ma non me lo ricordo piu'). La versione
senza lo sfondo urfido l'ho chiamata "italiamap.png".
I colori - nemmeno di questo ricordo il perche' - iniziano da 100, un
colore per provincia, quindi:
	$gd	= imageCreateFromPNG('italiamap.png');
	$ndx	= explode(','  , 'BZ,BL,UD,PN,GO,TV,VE,TN,SO,BS,VI,PD,'
				. 'TS,BG,LC,CO,VA,VB,VC,PV,BI,NO,TO,HG,'
				. 'MI,VR,CN,AT,AL,LO,CR,MN,RO,IM,SV,GE,'
				. 'PC,PR,RE,MO,FE,BO,SP,RA,FO,MS,LU,PT,'
				. 'PO,FI,AR,RN,PS,AN,PI,LI,SI,PG,MC,GR,'
				. 'VT,TR,AP,RM,RI,TE,AQ,PE,CH,LT,FR,SS,'
				. 'NU,OR,CA,IS,CB,CE,BN,FG,AV,NA,SA,PZ,'
				. 'BA,MT,TA,BR,LE,CS,KR,CZ,VV,RC,ME,PA,'
				. 'TP,AG,EN,CL,CT,SR,RG');
#ifdef PHP5
	# Questo non l'ho testato
	$ndx	= array_combine(array_values($ndx),array_keys($ndx));
	imageColorSet($gd, $ndx['RM']+100, 255,  0,  0);
	imageColorSet($gd, $ndx['NA']+100, 255,255,255);
	imageColorSet($gd, $ndx['MI']+100,   0,255,  0);
#else
	imageColorSet($gd, array_search('RM', $ndx)+100, 255,  0,  0);
	imageColorSet($gd, array_search('NA', $ndx)+100, 255,255,255);
	imageColorSet($gd, array_search('MI', $ndx)+100,   0,255,  0);
#endif
	Header('Content-Type: image/jpeg');
	ImageJPEG($gd);
...ti fa l'Italia con Napoli, Roma e Milano nei colori nazionali.


 				. 'TP,AG,EN,CL,CT,SR,RG');
ho letto nel manuale imageColorSet ma non riesco a capire in che modo 
associ l'area specifica della immagine (cioč, dove andrai a riempire) e 
la provincia. Sono troppo seccante se ti chiedo di chiarirmi questo aspetto?

 	imageColorSet($gd, array_search('MI', $ndx)+100,   0,255,  0);
In pratica, tu assegni un colore alla zona che ha quell'indice (che è 
dato dalla posizione della sigla della provincia nell'array+100). Quello 
che non capisco è: come vengono assegnati gli indici alle singole 
porzioni dell'immagine? E' qualcosa che viene fatto previamente con un 
editor di immagini?

 editor di immagini?
Mai usato l'Amiga, vero? :)
Nelle immagini bitmap con palette (GIF, PNG e il mitico IFF ILBM) ogni 
pixel dell'immagine non e` altro che un numero da 0 a 255 che rappresente 
un indice di array nella tabella dei colori (la palette), che contiene le 
triplette RGB (o RGBA per PNG)
Ti basta disegnare le regioni ognuna con indice di colore diverso, e poi 
mettere nella palette tutti i valori RGB uguali per tutti gli indici.
Per evidenziare una regione ti basta cambiare il valore RGBA nella palette 
(che fai con ImageColorSet()) senza modificare l'immagine.
Bye.

 (che fai con ImageColorSet()) senza modificare l'immagine.
a me in effetti serve che si crei una nuova immagine con le modifiche, 
ma questa è fesseria. Non riesco ad afferrare la parte precedente   :-)

 del genere ma solo con immagini con alpha channel.
a me sembra che se una immagine non ha un bordo completamente di un 
colore, c'è poco da fare: il fill fuoriesce. Ora, se il tuo bordo è un 
"arzigogolo" che deve essere visibile nella sua bellezza di arzigogolo, 
sei fritto. Altrimenti puoi rendere il tutto in b/n ma perdi in 
"bellezza". Scusa le categorie, ma è per farmi capire   :-)  Ciò, non ti 
impedisce, una volta eseguito il fill su di una immagine di base, di 
usare imagecopymerge e copiarci su l'arzigogolo: questo fa apparire 
decenti le linee dell'arzigogolo ma il risultato non è di una pulizia 
sopraffina   :-)


-- 
ValeRyo - GS500F "Camilla"
Comitato Per La Salvaguardia Dell'Italiano
E anche tu potrai dire: quest'hanno c'č l'ho l'iscrizione!


 operare la sostituzione.
No, sono tutte dello stesso verde.
Immagina una tabellina con dei numeri da 0 a 255 (la palette).
Ogni numero è di un colore rgb (diverso, uguale, non importa).
Ora prendi la tua immagine e per ogni pixel dici: questo è di
colore 101, questo è di colore 102, questo di colore 103.
Nel caso della mappa di Leonardo, i colori 101, 102 e 103
corrispondono allo stesso valore rgb, quindi tutti i pixel
sono dello stesso colore, pur corrispondendo a colori
diversi nella palette.
Se prendi la palette e cambi il valore rgb del colore 101, tutti
i pixel 'color 101' saranno visualizzati con il valore rgb.


 senza lo sfondo urfido l'ho chiamata "italiamap.png".
Magari c'entra con i permessi? :-)
Grazie mille, comunque!





Esattamente.


 Esattamente.
cominciavo a sentirmi cretino, e non è scontato che non lo sia   :-)
Con quale editor può essere fatta la cosa? Non ho PhotoShop, puoi 
consigliarmi un editor? Vorrei fare un test basato sul tuo suggerimento

 
sì, la teoria credo mi sia abbastanza chiara (m'illudo?   :-) )
Avrei necessità di un editor per poter ripetere l'esperimento

> colore, c'è poco da fare: il fill fuoriesce. Ora, se il tuo bordo è un
ok, no problem   ;-)




PSP 4.15 SE abandonware.
Per me, numero uno!
Lo so, fa schifo e non supporta i TIFF YCbCr. Pero' sono due mega zippati,
gira dappertutto, parte in 2" netti, e va pare unto.
Ho comprato PSP 8 e non lo uso mai. Mi sta bene: cosi' imparo :-(
 
ftp://ftp.uv.es/pub/windows/win95/oldstuff/psp415se.zip
Purtroppo, la JASC e' poi stata assorbita dalla Corel, che adesso vende la
propria roba - Corel Paint Shop Pro Photo X2 - per una settantina di euro.
E' un programma che fa anche i panini:
 
http://www.corel.com/servlet/Satellite/us/en/Product/1184951547051
"Fai sembrare la gente nelle tue foto piu' magra, con i denti piu' bianchi
e gli occhi piu' luminosi" -- sheesh.
In compenso la funzione "Cambia i colori al muro e al mobilio" vi potrebbe
far risparmiare 700 EUR di imbianchino e una settimana di sfàssi il fegato
a colpi di "Ma io pensavo venisse un colore piu', piu'... piu'. E anche la
poltrona, no, via, dev'essere rossa. Con la capottina gialla". Meditate.
 
http://www.corel.com/servlet/Satellite/us/en/Product/1185293062156
Leonardo (no, non mi paga la Corel. Ma nel caso non rifiuterei... :-) )


 Per me, numero uno!
Grazie per la carrellata!   :-)
Ho installato PSP 4.15 SE su Windos Svista Come Premio:
ora, data una immagine con 4 quadrati dello stesso colore, come creo un 
indice differente per ciascuna area? Lo so, sono seccante: se non 
puoi/vuoi rispondere non preoccuparti, cerco di cavarmela da solo.
Grazie di tutto!

 Per me, numero uno!
Quoto!
Io adoravo *JASC* PSP.
Quelli della Corel l'hanno migliorato... peggiorandolo. :(
Anche solo dandogli quel nome, "Corel PSP". Non era più lui. :o)
C'è comunque da dire che il mio era un uso solo amatoriale.
Ciao, Maverick
-- 
«Che non siete più liberi di non avere una casa con letto per dormire.
 Lavorate voi - schiavi dei soldi - che non sentite la puzza della
 schiavitù!» (a Mario di Monte Mario, Roma) # 
http://libre.netsons.org/

 rispondere non preoccuparti, cerco di cavarmela da solo.
Non uso Windows, ma su Linux puoi provare mtpaint e gpaint.
Prova cosi`:
disegna 4 rettangoli di colori diversi (presi dalla palette) sullo 
schermo, poi modifica il colore della palette (senza toccare i rettangoli).
Mentre cambi il colore della palette dovrebbe cambiarti anche il colore 
del rettangolo corrispondente.
Quando avrai modificato 4 i colori mettendoli tutti uguali avrai capito 
come funziona: ti basta modificare il colore della palette per cambiare 
tutto il rettangolo senza doverlo ridisegnare.
ye.

 Prova cosi`:
Alessandro, ti ringrazio, ma sto rinunciando al sistema di Leonardo, a 
favore di quello individuato all'inizio. Dopotutto, il risultato 
dovrebbe essere simile: o individuo un pixel all'interno di in un'area 
con un bordo di un colore unico (peccato che non si possa usare | per 
definire un gruppo di colori possibili per il bordo) o individuo quali 
aree dell'immagine hanno il tale indice, penso che la cosa non cambi 
tantissimo, se non per il fatto che devo stare attento all'unicità del 
colore del bordo (cosa non facile con disegni molto complessi perché un 
bordo che tu credi sia nero è magari fatto di sette grigi e la 
conversione dell'immagine aiuta il fill a fare il suo dovere ma non 
mantiene la qualità del bordo originale).

j2them ha scritto:

occhio alle varianti
imagefill — Flood fill
imagefilltoborder — Flood fill to specific color

> imagefilltoborder — Flood fill to specific color
questo è fino ad un bordo di colore unico, imagefill è illimitato, cioè 
ti riempie tutto, o sbaglio?

> imagefill — Flood fill
mi sbagliavo: fa una cosa che mi è DECISAMENTE utile! Riempie un'area 
specifica con un colore, non tutta l'immagine. Grazie Magilla!   :-)