2013-06-07 26 views
10

Ho cercato dappertutto come gestire correttamente alpha quando sto ridimensionando un png. Sono riuscito a farlo mantenere la trasparenza, ma solo per i pixel che sono completamente trasparenti. Qui è il mio codice:Ridimensiona le immagini con trasparenza in php

$src_image = imagecreatefrompng($file_dir.$this->file_name); 
$dst_image = imagecreatetruecolor($this->new_image_width, $this->new_image_height); 
imagealphablending($dst_image, true); 
imagesavealpha($dst_image, true); 
$black = imagecolorallocate($dst_image, 0, 0, 0); 
imagecolortransparent($dst_image, $black); 
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $this->new_image_width, 
       $this->new_image_height, $this->image_width, $this->image_height); 
imagepng($dst_image, $file_dir.$this->file_name); 

A partire da questa fonte immagine con:

enter image description here

L'immagine ridimensionata appare così:

enter image description here

La soluzione per quasi tutti i forum post ho 'ho guardato su questo problema dire di fare qualcosa di simile:

imagealphablending($dst_image, false); 
$transparent = imagecolorallocatealpha($dst_image, 0, 0, 0, 127); 
imagefill($dst_image, 0, 0, $transparent); 

I risultati di questo codice non riesce a salvare qualsiasi alpha di sorta:

enter image description here

C'è qualche altra soluzione? Mi manca qualcosa con l'alpha blending? Perché dovrebbe funzionare per tutti, ma fallire completamente per me? Sto usando MAMP 2.1.3 e PHP 5.3.15.

+0

possibile duplicato di [Come ridimensionare i png con trasparenza in PHP?] (Http://stackoverflow.com/questions/279236/how-do-i-resize-pngs-with-transparency-in-php) – Danack

+0

Ho provato le soluzioni fornite in quel post (e molti altri). Non hanno funzionato affatto e non sono sicuro del perché. – user2458399

risposta

-2

ho usato la classe simpleImage per ridimensionare l'immagine. È possibile ridimensionare l'immagine mantenendo le proporzioni. questa classe sta usando imagecreatetruecolor e imagecopyresampled funzioni core di PHP per ridimensionare un'immagine

$new_image = imagecreatetruecolor($width, $height); 
    imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); 
    $this->image = $new_image; 

trovare il codice completo a http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/

+0

Questa non è una domanda, ma è offtopic dal momento che il richiedente si rivolge specificamente alla libreria GD integrata di PHP ... (questo dovrebbe essere commento, non risposta) –

9
"They have not worked at all and I'm not sure why." 

Beh devi aver fatto qualcosa di sbagliato. Il codice del duplicato collegato con un paio di linee aggiunte per caricare e salvare l'immagine:

$im = imagecreatefrompng(PATH_TO_ROOT."var/tmp/7Nsft.png"); 

$srcWidth = imagesx($im); 
$srcHeight = imagesy($im); 

$nWidth = intval($srcWidth/4); 
$nHeight = intval($srcHeight /4); 

$newImg = imagecreatetruecolor($nWidth, $nHeight); 
imagealphablending($newImg, false); 
imagesavealpha($newImg,true); 
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127); 
imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent); 
imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, 
    $srcWidth, $srcHeight); 

imagepng($newImg, PATH_TO_ROOT."var/tmp/newTest.png"); 

produce l'immagine:

A resized PNG with transparency

vale a dire a questa domanda (e risposta) sono un duplicato completo .

+0

Quale piattaforma, versione di PHP/GD/Imagemagick avete entrambi? Questa è probabilmente la causa. In alternativa, l'overflow dello stack potrebbe essere la rielaborazione dell'immagine sorgente in modo da non testare la stessa immagine. – peterjwest

Problemi correlati