PHP [PHP] Librerie GD - imagefilledellipse con trasprenza

Stato
Discussione chiusa ad ulteriori risposte.

Rikards

Utente Gold
12 Giugno 2010
463
78
43
234
Ultima modifica da un moderatore:
Ciao a tutti!
sono incappato oramai da settimane in questa porzione di codice:

PHP:
<?php

        $myImageZoom = imagecreatefromjpeg('sample.jpg');
        $img = imagecreatefromjpeg('back.jpg');
      
           $src_img = $myImageZoom;
           $src_w = imagesx($myImageZoom);
           $src_h = imagesy($myImageZoom);
           $dst_w = $src_w;
           $dst_h = $src_h;
          
           $dst_img = imagecreatetruecolor($dst_w, $dst_h);
           imagecopy($dst_img, $src_img, 0, 0, 0, 0, $dst_w, $dst_h);
          
              $mask = $img;
           $maskTransparent = imagecolorallocate($mask, 255, 0, 255);
           imagecolortransparent($mask, $maskTransparent);
           imagefilledellipse($mask, $dst_w / 2, $dst_h / 2, $dst_w, $dst_h, $maskTransparent);
          
           imagecopymerge($dst_img, $mask, 0, 0, 0, 0, $dst_w, $dst_h, 100);
           $dstTransparent = imagecolorallocate($dst_img, 255, 0, 255);
           imagefill($dst_img, 0, 0, $dstTransparent);
           imagefill($dst_img, $dst_w - 1, 0, $dstTransparent);
           imagefill($dst_img, 0, $dst_h - 1, $dstTransparent);
           imagefill($dst_img, $dst_w - 1, $dst_h - 1, $dstTransparent);
           imagecolortransparent($dst_img, $dstTransparent);
          
          
        imagecopy($img, $dst_img, 20, 20, 0, 0, imagesx($dst_img), imagesy($dst_img));
      
        if(!imagepng($img, "imgfinale.png")) die('Salvataggio immagine fallito');
          
?>

Questo codice mi permette di trasformare un'immagine quadrata in forma rotonda, attraverso dei vari procedimenti trasformerà gli angoli rimossi in trasparenza.
2i6jodi.jpg


Successivamente provvederà a copiare la suddetta immagine in un'altra più grande.
15mfrqr.jpg

Ebbene la trasparenza funziona per il lato destro ed il lato inferiore, non per gli altri.
Mi spiego meglio: se l'immagine che andiamo a sovrapporre sarà posizionata in alto a sinistra (coordinate: 0, 0) sarà perfetta.
Mentre se la si sposta anche soltanto di un pixel più al centro, i lati superiore e sinistro non vengono bene.

fvzs3k.png


Il codice l'ho preso spunto da un altro sito e sinceramente non so bene come funziona l'algoritmo.
So che crea delle maschere, con dei colori, dopodiché va a eliminare questi colori negli angoli.
Io credo che la maschera debba essere spostata degli stessi pixel della foto.

Qualcuno può aiutarmi ?
PS: il codice è molto disordinato con variabili inutili, non fateci caso.
 
Ultima modifica:
Ho risolto il problema con questa funzione. per chi potesse farne buon uso:
Codice:
/* IMMAGINE CIRCOLARE CON TRASPARENZA */
function circle_img($myImageZoom, $img, $x_offset, $y_offset) {
   
           $src_img = $myImageZoom;
           $src_w = imagesx($myImageZoom);
           $src_h = imagesy($myImageZoom);
          $dst_w = $src_w / 2 + $x_offset;
          $dst_h = $src_h / 2 + $y_offset;
       
           $dst_img = imagecreatetruecolor($src_w, $src_h);
           imagecopy($dst_img, $src_img, 0, 0, 0, 0, $src_w, $src_h);

           $maskTransparent = imagecolorallocate($dst_img, 255, 0, 255);
           imagecolortransparent($img, $maskTransparent);
           imagefilledellipse($img, $dst_w, $dst_h, $src_w-1, $src_h-1, $maskTransparent);

           imagecopymerge($dst_img, $img, 0, 0, $x_offset, $y_offset, $src_w, $src_h, 100);
       
          imagecopy($img, $dst_img, $x_offset, $y_offset, 0, 0, imagesx($src_img), imagesy($src_img));
}

Dove $myImageZoom rappresenta l'immagine da arrotondare
$img l'immagine dove copiare la suddetta
$x_offset e $y_offset la posizione dell'immagine (x, y)

Chiudo
 
Stato
Discussione chiusa ad ulteriori risposte.