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