У меня проблема, когда мне нужно создать изображение с прозрачным фоном. Я до сих пор не знаю, связана ли проблема с 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'; }