Blackberry webworks 10 с использованием изображения из сделанного\загруженного изображения

Я застрял с проблемой, и я понятия не имею, что попробовать дальше.

В Моем приложении я предлагаю своему пользователю сделать снимок или выбрать фотографию из галереи. Эта часть работает нормально, возникает проблема с сохранением\чтением фото. Давайте возьмем это с точки зрения вызова камеры.

function startCameraApp() {
    PhotoTaken = false;
    blackberry.event.addEventListener("onChildCardClosed", sharePhoto);

    blackberry.invoke.invoke({
        target: "sys.camera.card"
    }, onInvokeSuccess, onInvokeError);
}

и в sharePhoto у меня есть следующий код...

function sharePhoto(request) {
    var image = new Image();
    image.src = "file://" + request.data;
    image.onload = function () {
        // Now here I need to read the image file and convert it into base64.
        var resized = resizeMe(image);  // the resizeMe function is given below and it simply makes my image smaller
        var imagedata = resized.split("base64,");
        sessionStorage.setItem("MyNewPicture", imagedata);
    }
}





function resizeMe(img) {

    var canvas = document.createElement('canvas');
    var max_width = 600;
    var max_height = 600;
    var width = img.width;
    var height = img.height;

    // calculate the width and height, constraining the proportions
    if (width > height) {
        if (width > max_width) {
            height = Math.round(height * max_width / width);
            width = max_width;
        }
    } else {
        if (height > max_height) {
            width = Math.round(width * max_height / height);
            height = max_height;
        }
    }

    //resize the canvas and draw the image data into it
    img.width = width;
    img.height = height;
    canvas.width = width;
    canvas.height = height;
    canvas.classname += "ui-hidden";
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, width, height);
    return canvas.toDataURL();
}

Таким образом, приложение запускается и делает снимок, и все выглядит нормально, но данные, загруженные в локальное хранилище, представляют собой просто пустой экран. В симуляторе Blackberry 10 работает на 100%, но не на моем устройстве. На устройстве он сохраняет пустую строку.

Изменить

Ok. Итак, я добавил это в свою функцию для целей тестирования, и я все еще застрял и не знаю, что делать...

function sharePhoto(request) {
    var image = new Image();
    image.src = "file://" + request.data;
    image.onload = function () {
        // Now here I need to read the image file and convert it into base64.
        var resized = resizeMe(image);  // the resizeMe function is given below and it     simply makes my image smaller
        var imagedata = resized.split("base64,");

        alert(imagedata); // This returns a blank popup

        sessionStorage.setItem("MyNewPicture", imagedata);
    }
}

person KapteinMarshall    schedule 25.11.2013    source источник


Ответы (2)


Я считаю, что когда вы используете метод split, он возвращает массив, поэтому вы можете получить к нему доступ следующим образом:

var resized = resizeMe(image);
var imagedata = resized.split("base64,");
    imagedata = imagedata[1]; // this gives you everything after the 'base64,' string

Однако основная проблема, которую я вижу, заключается в том, что вы разбиваете строку данных изображения, которая удаляет весь префикс «это изображение» из данных.

Когда вы отображаете данные изображения как изображение, вам также необходимо иметь префикс data:image/jpeg;base64,.

Таким образом, вашим источником изображений будет

data:image/jpeg;base64,<rest of base64 string here>
person chadtatro    schedule 26.11.2013
comment
split действительно возвращает массив. Однако это не было причиной моей проблемы. Я использовал base64,l в качестве разделения, так что я могу легко получить строку base64. Вы можете увидеть мой ответ ниже о том, что вызвало мою проблему. Спасибо за ваш ответ. - person KapteinMarshall; 27.11.2013

Мне нужно было включить дополнительный элемент в файл config.xml моего приложения.

<access subdomains="true" uri="file://accounts/"></access>
<access subdomains="true" uri="file://accounts/100/shared/camera/"></access>

Это дает вашему приложению доступ к этим папкам и содержащим их файлам. Симулятор не требует этого разрешения.

person KapteinMarshall    schedule 27.11.2013