2011-11-15 14 views
9

Sto cercando di ridimensionare alcune immagini di lucidi in PHP con GD, e ogni volta che faccio, c'è uno strano bordo nero che viene aggiunto intorno ad esso.PHP GD ridimensionamento dell'immagine trasparente con bordo nero

Prima before

Dopo enter image description here

Codice

<?php 
    $image = imagecreatefromstring(file_get_contents('logo.png')); 
    $width = imagesx($image); 
    $height = imagesy($image); 

    $newWidth = $width - 1; 
    $newHeight = $height - 1; 
    $output = imagecreatetruecolor($newWidth, $newHeight); 
    imagecolortransparent($output, imagecolorallocatealpha($output, 0, 0, 0, 127)); 
    imagealphablending($output, false); 
    imagesavealpha($output, true); 
    imagecopyresampled($output, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 

    header('Content-Type: image/png'); 
    imagepng($output); 
?> 

Sembra che se cambio il codice per le nuove dimensioni per essere lo stesso del vecchio (rimuovendo - 1), nessun bordo nero appare. Quindi il ridimensionamento sta causando il problema.

Qualcuno ha un'idea di cosa potrebbe essere sbagliato?

Edit: Ho appena realizzato succede solo con imagecopyresampled e non imagecopyresized. Tuttavia, imagecopyresampled offre un effetto visivo molto migliore e mi piacerebbe farlo funzionare se possibile.

+0

Sembra che l'anti-aliasing usi il nero per un colore opaco. – Brad

+0

@Brad davvero lo fa. Tuttavia, la pagina della documentazione dice che l'anti-aliasing è disattivato per impostazione predefinita e che viene fornito solo con la versione in bundle di GD, che non sto utilizzando. Forse alcune altre funzioni lo stanno causando ma non vedo nessun altro parametro per quanto posso dire ... –

+0

Ho appena realizzato che succede solo con ['imagecopyresampled'] (http://php.net/manual/en /function.imagecopyresampled.php) e non ['imagecopyresized'] (http://php.net/manual/en/function.imagecopyresized.php). Tuttavia, 'imagecopyresampled' offre un effetto visivo molto migliore e mi piacerebbe farlo funzionare se possibile. –

risposta

3

Penso che il problema qui sia la vostra immagine sorgente.

Quello che hai non è un PNG a colori reali con canale alfa, ma un PNG a colori indicizzati con un colore trasparente. Questo è evidente se si apre l'immagine in Photoshop:

Image as seen in Photoshop

Questa immagine è stata creata con l'anti-aliasing già (che dà il testo giallo che bordo bianco-ish visto qui), ma quando si ri-size questo, i calcoli sub-pixel possono andare un po 'al di fuori dei loro confini.

Sospetto che se si aggiusta l'immagine, rendendola RGB completa con un canale alfa, non si avrà questo problema.

+0

Grazie per la risposta. Potreste sapere in qualche modo di farlo funzionare programmaticamente o è annullabile? –

+0

La cosa migliore da fare sarebbe ottenere una buona immagine sorgente. Questo è stato facile da risolvere per te in Photoshop. Mandami un'e-mail all'indirizzo [email protected] e ti invierò il file aggiornato. – Brad

+0

grazie mille per il tuo aiuto. Il problema è che questo viene fatto dai nostri clienti sull'interfaccia web. Suppongo che dovranno arrangiarsi. Grazie ancora. –

Problemi correlati