2012-07-27 9 views
5

So che questo è stato coperto molte volte ma continuo a provare diversi script e modificare quello che ho, e io ancora non riesco a ottenere il mio watermark.png PNG-24 per essere trasparente sopra la parte superiore dell'immagine del mio genitore.PHP - Watermark PNG Transparency/Alpha

Questo è quello che ho attualmente:

<? 

header('content-type: image/jpeg'); 

$watermark = imagecreatefrompng('watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 

$image = imagecreatefromjpeg($imageURL); 
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$size = getimagesize($imageURL); 

imagealphablending($image, false); 
imagesavealpha($image, true); 

$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 

imagejpeg($image); 

imagedestroy($image); 
imagedestroy($watermark); 

?> 

Ho appena letto un'altra domanda SO e una delle risposte avvisato che non sarà trasparente se non si aggiunge queste due righe:

imagealphablending($image, false); 
imagesavealpha($image, true); 

li ho aggiunto e ancora non. Ho provato a impostare le intestazioni e l'output in PNG, ma ancora senza fortuna. Ho caricato la filigrana nel mio browser (raw) ed è decisamente trasparente ma non solo sull'immagine. Sicuramente questo non può essere così difficile? Qualche idea su cosa sto facendo male?

risposta

14

Non è un problema con il codice dell'applicazione, è l'immagine della filigrana (PNG) se stesso con.

Un sacco di esempi di filigrane/tutorial dicono di usare una filigrana PNG-24, ma secondo un blog che ho appena letto, dicono che lo imagecopymerge non gestisce molto bene i file PNG-24, quindi, usa PNG -8 e alcune impostazioni speciali di "Salva per Web". L'ho fatto e ora funziona bene.

Ecco l'apposita sezione sui tipi di PNG da this blog:

L'immagine filigrana dovrebbe essere in uno dei seguenti consigliati formati:

  • PNG-8 (consigliato)
    Colori : 256 o meno
    Trasparenza: On/Off
  • GIF
    Colori: 256 o meno
    Trasparenza: On/Off
  • JPEG
    Colori: True Color
    Trasparenza: n/a

La funzione imagecopymerge non gestire correttamente il formato PNG-24 immagini; quindi non è raccomandato.

Se si utilizza Adobe Photoshop per creare immagini della filigrana, è consiglia di utilizzare "Salva per Web" comando con i seguenti impostazioni:

File Format: PNG-8, non-interlaced 
Color Reduction: Selective, 256 colors 
Dithering: Diffusion, 88% 
Transparency: On, Matte: None 
Transparency Dither: Diffusion Transparency Dither, 100% 

E per di altri benefici , questo è il codice filigrana che funziona:

<? 
$masterURL = 'mydomain.com/myImage.jpg'; 

header('content-type: image/jpeg'); 
$watermark = imagecreatefrompng('watermark.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 
$image = imagecreatetruecolor($watermark_width, $watermark_height); 
$image = imagecreatefromjpeg($masterURL); 
$size = getimagesize($masterURL); 
$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 
imagejpeg($image); 
imagedestroy($image); 
imagedestroy($watermark); 
?> 

Dopo un po 'di più ading (this comment sullo stesso articolo), ho scoperto che è possibile utilizzare PNG-24 ma con filigrane imagecopy invece di imagecopymerge.È possibile sostituire questa linea:

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 

con questo:

imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); 

Utilizzando imagecopymerge con PNG-8 filigrane è abbastanza buono per 'on-the-fly' watermarking, come il file di filigrana è molto piccolo . Se si esegue il watermarking "dietro le quinte", non è molto importante la dimensione del file e si può ottenere una qualità molto migliore dalla filigrana PNG-24, utilizzando imagecopy.

Spero che questo aiuti i watermarker confusi là fuori.

+1

Si prega di non includere schermate di testo. – meagar

+2

@meagar: perché? Se ti infastidisce così tanto, riscrivilo! – TheCarver

+5

L'ho fatto, ma non avrei dovuto. Non salvare il testo dello screenshot. È dannoso per il web, cattivo per il sito e cattivo per i suoi utenti. – meagar