После сохранения изображения с помощью этой команды
$("#canvas").jSignature("getData", "base30");
мы можем сохранить эти данные в БД и это простая строка:
data:image/jsignature;base30,9MZ4555665655465644644645433232100Y2333465656786456646464443Z54334433222Y13344544486666667775353646443_2xZ110000000Y1111111222223222344555332220100000Z11111121212130Y122222333343222111100000Z1111212222122212
А теперь как сделать изображение с подписи «base30»? Можем ли мы преобразовать это во что угодно, чтобы он отображался на веб-сайте?
Или, возможно, есть способ отключить редактирование холста. Чтобы предотвратить изменение подписи?
Я сделал небольшое обходное решение, и оно работает.
Я создал невидимый div, где я загружал jSignature из БД и делал его невидимым, затем я получаю svg из него и отображаю, что svg на странице
<div id="oldSignature" style="display: none"></div> <object id="img" type="image/svg+xml" data=""> Your browser doesn't support SVG! </object>
@if (isset($offer->signature)) var sigCanvas = $("#oldSignature").jSignature({width: 700, height: 180, "background-color":"#ddd"}); $("#oldSignature").jSignature("importData", "{{$offer->signature}}"); var svg = $("#oldSignature").jSignature("getData", "svg"); $("#img").attr("data", 'data:' + svg); @endif
Посмотрите в папку экстрасети на Github . Существуют примеры php и DotNet.
Что касается формата Base30, то документы для jSignature говорят
base30 (псевдоним image / jSignature; base30) (формат EXPORT AND IMPORT) (VECTOR) – это формат сжатия, поддерживающий Base64, настроенный для абсурдной компактности и родной совместимости с url. Это «родная» структура данных, сжатая в компактное строковое представление всех векторов. Примеры кода (.Net, Python), детализирующие декомпрессию этого формата в визуализируемой форме (SVG, языковые собственные массивы координат), содержатся в папке дополнительных функций . Одним из возможных способов передачи данных на сервер является JSONP, который имеет практическое ограничение длины URL-адреса (на которое указывает IE, конечно) не более 2000+ символов. Этот формат сжатия основан на URL-совместимости без необходимости повторного кодирования, но для большинства некомплексных подписей он будет помещаться в 2000 символов.
Изменить – для тех, кто не имеет успеха с примером / extras, в этом случае может быть полезный код справки / примера в Github, связанном с Convert Base30 в PNG с использованием PhP . Здесь слишком много подробностей.
Я использовал вышеупомянутый ответ и немного изменил функцию, чтобы получить следующее. Это сработало для меня.
<?php ini_set ( 'display_errors', E_ALL ); require_once ('jSignature_Tools_Base30.php'); function base30_to_jpeg($base30_string, $output_file) { $data = str_replace ( 'image/jsignature;base30,', '', $base30_string ); $converter = new jSignature_Tools_Base30 (); $raw = $converter->Base64ToNative ( $data ); // Calculate dimensions $width = 0; $height = 0; foreach ( $raw as $line ) { if (max ( $line ['x'] ) > $width) $width = max ( $line ['x'] ); if (max ( $line ['y'] ) > $height) $height = max ( $line ['y'] ); } // Create an image $im = imagecreatetruecolor ( $width + 20, $height + 20 ); // Save transparency for PNG imagesavealpha ( $im, true ); // Fill background with transparency $trans_colour = imagecolorallocatealpha ( $im, 255, 255, 255, 127 ); imagefill ( $im, 0, 0, $trans_colour ); // Set pen thickness imagesetthickness ( $im, 2 ); // Set pen color to black $black = imagecolorallocate ( $im, 0, 0, 0 ); // Loop through array pairs from each signature word for($i = 0; $i < count ( $raw ); $i ++) { // Loop through each pair in a word for($j = 0; $j < count ( $raw [$i] ['x'] ); $j ++) { // Make sure we are not on the last coordinate in the array if (! isset ( $raw [$i] ['x'] [$j] )) break; if (! isset ( $raw [$i] ['x'] [$j + 1] )) // Draw the dot for the coordinate imagesetpixel ( $im, $raw [$i] ['x'] [$j], $raw [$i] ['y'] [$j], $black ); else // Draw the line for the coordinate pair imageline ( $im, $raw [$i] ['x'] [$j], $raw [$i] ['y'] [$j], $raw [$i] ['x'] [$j + 1], $raw [$i] ['y'] [$j + 1], $black ); } } // Check if the image exists if (! file_exists ( dirname ( $output_file ) )) { mkdir(dirname($output_file)); } // Create Image $ifp = fopen ( $output_file, "wb" ); imagepng ( $im, $output_file ); fclose ( $ifp ); imagedestroy ( $im ); return $output_file; } // test $imgStr ='image/jsignature;base30,7U010100010000000001_1G88b8ace99aab756856_bE2000000010000000101_1D6689cbaa9b956558564_8w757698987766566556545_3PZ2110101010100000000Y10_fF0000Z2100001000Y110_1V9789cb86966655475_fK_1x'; base30_to_jpeg ( $imgStr, 'test.png' ); ?>