Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сохранять изображения в localStorage? (https://javascript.ru/forum/misc/58320-kak-sokhranyat-izobrazheniya-v-localstorage.html)

Валерий1996 15.09.2015 12:31

Как сохранять изображения в localStorage?
 
Подскажите где ошибка в коде ? Я пытаюсь сохранить изображение з гугл по урл в локальное хранилище, потом достать из хранилища изображение и вставить в DOM.

Вот мой код :
<canvas  id='example'></canvas>
<img id="imageId" src="" >



function getBase64Image(img) {
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;

    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);

    var dataURL = canvas.toDataURL("http://shrek.by/Photo/Shrek.jpg");

    return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}




var image = document.getElementById('imageId');
var b64image = getBase64Image(image);
localStorage.setItem('imageIdCached', b64image);



Вот весь код: http://jsfiddle.net/t52ka/123/

laimas 15.09.2015 13:04

Сначала вопрос такой - вы это для себя хотите или же для посетителей вашего ресурса?

tsigel 15.09.2015 13:04

Валерий1996,
Во первых ваш скрипт выполняется до загрузки body и выдает ошибку. Во вторых вы не правильно пользуетесь АПИ canvas
https://developer.mozilla.org/en-US/...ment/toDataURL

Валерий1996 15.09.2015 13:12

Цитата:

Сообщение от laimas (Сообщение 388704)
Сначала вопрос такой - вы это для себя хотите или же для посетителей вашего ресурса?

Это не ресурс , это браузерное приложение . Поэтому нужна возможность подгружать картинки по урл , засововать в локальное хранилище, с возможностью потом достать картинку с локального хранилища.

laimas 15.09.2015 13:22

У вас все не правильно, к тому же запрос по url породит ошибку SecurityError. Браузерное приложение это как, плагин к нему?

tsigel 15.09.2015 13:23

Валерий1996,
http://stackoverflow.com/questions/2...-securityerror

Валерий1996 15.09.2015 13:29

Цитата:

Сообщение от laimas (Сообщение 388709)
У вас все не правильно, к тому же запрос по url породит ошибку SecurityError. Браузерное приложение это как, плагин к нему?

А если так: http://jsfiddle.net/bonilka/2f1kj48g/ ?

Валерий1996 15.09.2015 13:59

Цитата:

Сообщение от laimas (Сообщение 388709)
У вас все не правильно, к тому же запрос по url породит ошибку SecurityError. Браузерное приложение это как, плагин к нему?

Это типа приложения на стороне клиента(браузера), написаное на клиетском, ява скрипте без использования сервера. Всё, что должно делать это прложение брать картинку по урл , сохранять её в локальное хранилище, чтоб можна было достать потом картинку и и вставить в dom

laimas 15.09.2015 15:57

Цитата:

Сообщение от Валерий1996
А если так


И получается так? И не получится. Чтобы задать размер канве, нужно дождаться окончания загрузки изображения. Задание атрибута crossOrigin изображению разрешит загрузить его в канву, а вот при получении его эта ошибка возникать будет, хотя и данные будут возвращены. Чтобы не надоедало, можно обернуть в try ... catch.

function getImg(im) {
    var canvas = document.createElement('canvas'),
        ctx = canvas.getContext('2d');
        
    canvas.width = im.width;
    canvas.height = im.height;
        
    try {
        ctx.drawImage(im, 0, 0);
        //base64 to localStorage
        var imageData = canvas.toDataURL();
        console.log(imageData);
    } catch (e) {}
}


<img id="imageId" crossOrigin="*" src="https://unsplash.it/300/200/?random" onload="getImg(this)"/>


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

PS. toDataURL("image/png") - это лишено смысла, так как по умолчанию тип возвращаемого изображения и будет png, задание типа имеет смысл, если нужно вернуть в jpeg формате.

PPS. crossOrigin - заголовок, который передается сервером, и равен либо конкретному домену, либо всем (*). У изображения же можно написать просто crossOrigin и все. А если говорить о локальном приложение, то тогда либо VBS, либо если под win, можно HTA-приложение, и никаких ограничений не будет.


Часовой пояс GMT +3, время: 12:22.