Ответ 1
1) Это единственный способ конвертировать изображение в строку локально (с использованием файлов FileReader, см. ниже). Для этого вам необходимо использовать сервер.
2) Чтобы получить изображение в формате JPEG, вам нужно использовать такой аргумент:
var datauri = imgCanvas.toDataURL("image/jpeg", 0.5); //0.5 = optional quality
не используйте data:...
в аргументе, так как это будет недействительным, и оно выдает PNG по умолчанию, как вы можете видеть в своем результате. toDataURL()
может принимать только тип, т.е. image/png
, image/jpeg
и т.д.
3)
Внешние файлы
Если ваше изображение было загружено из другого источника (схема, сервер...) или с помощью локальных файлов с ссылками (file://
, /my/path/
и т.д.), CORS запускает и предотвратит создание данных-uri, то есть: изображение будет пустым (и, следовательно, невидимым).
Для внешних серверов вы можете запросить разрешение на использование изображения из кросс-начала, предоставив свойство crossOrigin
:
<img src="http://extrernalserver/...." crossOrigin="anonymous" />
или по коду (img.crossOrigin = 'anonymous';
) перед установкой src
.
Тем не менее, сервер может разрешить или отклонить запрос.
Если он по-прежнему не работает, вам нужно будет загрузить изображение через прокси (f.ex. страница на вашем сервере, которая может загружать и изображение извне и обслуживать ее с вашего собственного сервера).
Или, если у вас есть доступ к конфигурации сервера, вы можете добавить заголовки разрешений доступа (Access-Control-Allow-Origin: *
, см. ссылку ниже для более подробной информации).
CORS (Совместное использование ресурсов для перекрестных ссылок) является механизмом безопасности и не может работать иначе, чем эти способы.
Локальные файлы
Для локальных файлов вам нужно будет использовать FileReader
- это может оказаться преимуществом, поскольку FileReader
поставляется с удобным способом: readAsDataURL()
. Это позволяет вам "загружать" файл изображения напрямую в виде данных-uri, не перемещаясь по холсту.
См. примеры здесь:
https://developer.mozilla.org/en-US/docs/Web/API/FileReader
К сожалению, вы не можете просто выбрать файлы из кода - вам нужно будет предоставить элемент ввода или зону переадресации, чтобы пользователь мог выбрать файлы (ы), которые он хочет сохранить.
Заключение
Если все эти шаги выполняются до такой степени, что вы действительно получаете изображение, проблема, возможно, находится на другом конце, причем усеченная строка слишком длинная для хранения.
Вы можете проверить, проверив длину до и после сохранения строки, чтобы увидеть, была ли она разрезана:
console.log(imgAsDataURL.length);
... set / get ...
console.log(pic.length);
Другие возможности:
- Элемент изображения не определен правильно.
- Ошибка в браузере
- Ошибка в структуре
(Я думаю, что я рассмотрел большинство типичных ловушек?)
Обновить (пропущенный, тип..; -p)
OP нашел конкретное в структуре, которое я буду здесь включать для дальнейшего использования:
В конце концов, проблема была в
$('#TestScreen_mobileimage_1').src = policy_shot ;
Я использую Appery.io, и они не поддерживают.src
.It
$('#TestScreen_mobileimage_1').attr("src", policy_shot ) ;
Последнее примечание: localStorage
очень ограничен в отношении хранения изображений. Типичное пространство для хранения составляет 2,5 - 5 мб. Каждый хранимый char занимает 2 байта, а сохранение данных-uri, закодированных как base-64, на 33% больше, чем оригинал, поэтому пространство будет скудным. Посмотрите на индексированные DB, Web SQL или File API для хороших альтернатив.