2012-03-19 1 views
5

Ho un problema qui quando ho bisogno di creare un'immagine con sfondo trasparente. Non so ancora se il problema è con fabricjs o con php. Tutto funziona bene quando ho inviato un'immagine con sfondo colorato. Il problema si verifica quando invio un'immagine con uno sfondo trasparente. L'immagine generata viene creata con sfondo nero. Quindi, mi spiego meglio: Quando l'utente fa clic sul pulsante Salva, sto inviando la rappresentazione della stringa della tela su php sul lato server, per generare l'immagine della tela. Così sto utilizzando la funzione di seguito all'invio la rappresentazione di stringa della tela da Ajax (funzione POST di jQuery):Fabric.js canvas.toDataURL() inviato a PHP da Ajax

 

    function sendStringRepresentation(){ 
     var strDataURI = canvas.toDataURL(); 
     strDataURI = strDataURI.substr(22, strDataURI.length); 

     $.post("action/createImage.php", 
     { 
      str: strDataURI 
     }, 
     function(data){ 
      if(data == "OK"){ 
       $("#msg").html("Image created."); 
     } 
     else{ 
      $("#msg").html("Image not created."); 
      } 
     }); 
    } 

Nel file di Io PHP utilizzando il codice di seguito per generare l'immagine:

 

    // createImage.php 

    $data = base64_decode($_POST["str"]); 

    $urlUploadImages = "../uploads/img/"; 
    $nameImage = "test.png"; 

    $img = imagecreatefromstring($data); 

    if($img) { 
     imagepng($img, $urlUploadImages.$nameImage, 0); 
     imagedestroy($img); 

     // [database code] 

     echo "OK"; 
    } 
    else { 
     echo 'ERROR'; 
    } 

Anche in questo caso, il problema è solo con la tela di sfondo trasparente. Con lo sfondo colorato tutto funziona bene.

risposta

1

Non so se questo è esattamente il problema che si verifica, ma alcune delle funzioni imagecreate*10 della libreria GD creano immagini senza il canale alfa.

La soluzione che ho trovato è quella di creare un'immagine utilizzando imagecreatetruecolor e copiare l'immagine trasparente su di esso.

Prova un processo come questo:

$img = imagecreatefromstring($data); 
$w = imagesx($img); 
$h = imagesy($img); 
$alpha_image = imagecreatetruecolor($w, $h); 
imagecopyresampled($alpha_image, $img, 0, 0, 0, 0, $w, $h, $w, $h); 

Questo dovrebbe garantire che si finisce con un'immagine "vero colore" con il corretto canale alfa.

+0

cerco utilizzare la soluzione, ma sto ancora ottenere uno sfondo nero invece un'immagine con sfondo tranparent. Qualcosa che ho notato è che l'immagine finale ha un aspetto migliore con la tua soluzione. Prima, con il mio codice, l'immagine finale ha un bordo dentellato bianco in un'immagine png e un bordo seghettato nei testi che ho inserito all'interno della tela. Ora, usando la tua congestione del codice, questo bordo uggly seghettato non ha più nell'immagine finale. Va bene, ma ho ancora il problema con lo sfondo trasparente. mio: [collegamento] (http://f.imgtmp.com/puy05.png) tuo: [collegamento] (http://f.imgtmp.com/EGWel.png) – rodrigopandini

+0

Ora lo risolvo. Sto usando la nuova funzione di GD lib di PHP. Il problema è in PHP non in Fabric.js. Controlla questo [link] (https://gist.github.com/2149853) – rodrigopandini

+0

Grande, felice che tu sia stato in grado di risolverlo. Qual era la funzione che dovevi usare? oh, non importa, ho appena visto il tuo succo. Quindi dovevi riempire esplicitamente la vera immagine a colori con piena trasparenza prima di copiare la tua fonte su di essa. Huh. wtfphp per davvero. – goldenapples

3

L'ultimo passo è esattamente il contrario:

imagecopyresampled($img, $alpha_image, 0, 0, 0, 0, $w, $h, $w, $h); 

E voilà! L'immagine è trasparente!

0

JPG toDataURL trasforma lo sfondo trasparente in nero.

0

Ho avuto lo stesso problema e ho aggiunto questo
imageAlphaBlending ($ img, true);
imageSaveAlpha ($ img, true);

al codice del rodrigopandini e funziona perfetto ora. :)

// createImage.php 

$data = base64_decode($_POST["str"]); 

$urlUploadImages = "../uploads/img/"; 
$nameImage = "test.png"; 

     $img = imagecreatefromstring($data); 

     imageAlphaBlending($img, true); 
     imageSaveAlpha($img, true); 

if($img) { 
    imagepng($img, $urlUploadImages.$nameImage, 0); 
    imagedestroy($img); 

    // [database code] 

    echo "OK"; 
    } 
    else { 
      echo 'ERROR'; 
      } 
1

Perché ha utilizzato GD per questo? Puoi usare file_put_contents per salvare il file png dal tuo canvas.

// createImage.php

$data = base64_decode($_POST["str"]); 

$urlUploadImages = "../uploads/img/test.png"; 
file_put_contents($urlUploadImages, $data);