@whynot

Base64, imagecreatefromstring и черные квадраты?

Здравствуйте. Понадобилось сделать сохранение промежуточных результатов из нарисованного канваса на сервере.

Одно «но» на сохраненные картинки нужно ставить вотермарк.

Делаю следующим образом:
var canvas = document.getElementById('canvas'),
        dataURL = canvas.toDataURL("image/jpeg");
    //отправляю POST-запрос с dataURL


На серверной стороне:
$dataURL = base64_decode(str_replace('data:image/jpeg;base64,', '', $_POST['dataURL']));
        $image = imagecreatefromstring($dataURL);
        ob_start();
        //где-нибудь тут ставлю вотермарк
        imagejpeg($image);
        $filename = 'test.jpeg';
        $binaryImage = ob_get_clean();
        $file = fopen ($filename, 'w');
        fwrite($file, $binaryImage);


И получаю черный квадрат. При этом, если я делаю что-то вроде
$dataURL = file_get_contents('1.jpeg');
        $image = imagecreatefromstring($dataURL);
        ob_start();
        //где-нибудь тут ставлю вотермарк
        imagejpeg($image);
        $filename = 'test.jpeg';
        $binaryImage = ob_get_clean();
        $file = fopen ($filename, 'w');
        fwrite($file, $binaryImage);


То всё в порядке. Из-за чего возникают сомнения в, как бы правильнее выразиться, правильном формате base64-строки на клиенте. Ощущение, что канвас выдает что-то, непонятное для php-шной imagecreatefromstring();

Не сталкивался никто?

Спасибо.
  • Вопрос задан
  • 5296 просмотров
Пригласить эксперта
Ответы на вопрос 4
OlegTar
@OlegTar
программист .NET, Javascript, Perl
Есть предположение, что в POST['dataURL'] попадаёт не вся строка.

выведите строку base64, которую получаете в JS.
выведите строку base64, которую получаете в POST['dataURL']

сравните их.
Ответ написан
webscout
@webscout
Проверил ваш скрипт. Именно с image/jpeg не работает. Если закодировать javascriptом в png, то все хорошо.

Из этого вывод: проблема не в base64_decode, проблема, скорее всего в кодировании браузером jpeg.
Если так нужен jpeg, как выходной формат, то может лучше конвертировать на сервере с помощью того же GD?
Ответ написан
OlegTar
@OlegTar
программист .NET, Javascript, Perl
Какой браузер?
Щас проверил в Хроме. Оказывается, что если вызываешь метод toDataURL('image/jpeg');
Он выводит image/png!

В Файрфоксе такой проблемы нет.
Ответ написан
Комментировать
OlegTar
@OlegTar
программист .NET, Javascript, Perl
Щас проверил.

В Хроме 8 можно писать, что хочешь в параметре toDataURL, даже белиберду, он будет возвращать всегда image/png

Firefox 3.6.13 на параметры смотрит: если в toDataURL пошлёшь параметр, который Firefox не знает, он ничего не выведет.
Пока выявил, что Firefox знает 2 параметра: image/png и image/jpg (ни image/gif, ни image/bmp не знает)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы