Fabric.js canvas.toDataURL (), отправленный на PHP Ajax

У меня проблема, когда мне нужно создать изображение с прозрачным фоном. Я до сих пор не знаю, связана ли проблема с fabricjs или с php. Все работает отлично, когда я отправил изображение с цветным фоном. Проблема возникает, когда я отправляю изображение с прозрачным фоном. Сгенерированное изображение создается черным фоном. Итак, позвольте мне лучше объяснить: когда пользователь нажимает кнопку сохранения, я отправляю строковое представление холста на php на стороне сервера, чтобы сгенерировать изображение холста. Поэтому я использую следующую функцию для отправки строкового представления холста Ajax (функция POST из jQuery):


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

         $ .post ( "действие / createImage.php",
         { 
             str: strDataURI
         },
         Функция (данные) {
             if (data == "OK") {
                 $ ("# msg"). html ("Изображение создано.");
         }
         еще {
             $ ("# msg"). html ("Изображение не создано.");
             }
         });
     }

В PHP-файле я использую следующий код для генерации изображения:


     // 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);

         // [код базы данных]

         эхо «ОК»;
     }
     else {
         echo 'ERROR';
     }

Опять же, проблема заключается только в фоне прозрачного холста. С цветным фоном все отлично работает.

Последний шаг совершенно противоположный:

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

И вуаля! Изображение прозрачное!

Я не знаю, является ли это именно то, что вы испытываете, но некоторые функции imagecreate* библиотеки GD создают изображения без альфа-канала.

Обходной путь, который я нашел, – создать образ с помощью imagecreatetruecolor и скопировать на него прозрачное изображение.

Попробуйте выполнить такой процесс:

 $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 ); 

Это должно гарантировать, что вы получите изображение «истинного цвета» с соответствующим альфа-каналом.

Почему вы использовали GD для этого? Вы можете использовать file_put_contents для сохранения png-файла с вашего холста.

// createImage.php

 $data = base64_decode($_POST["str"]); $urlUploadImages = "../uploads/img/test.png"; file_put_contents($urlUploadImages, $data); 

JPG toDataURL преобразует прозрачный фон в черный.

У меня была такая же проблема, и я добавил
imageAlphaBlending ($ img, true);
imageSaveAlpha ($ img, true);
для кода rodrigopandini, и теперь он отлично работает. 🙂

  // 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'; }