2010-09-08 1 views
5

Можно ли использовать canvas.toDataURL() в Adobe AIR?Как использовать canvas.toDataURL(), чтобы получить base64 изображения в Adobe AIR?

Когда я пытаюсь я получаю следующее сообщение об ошибке:

Error: SECURITY_ERR: DOM Exception 18

+0

объяснить, пожалуйста, что вы хотите этим? может быть, лучше разместить этот холст внутри какого-либо другого контейнера, с которым вы сможете связать? – Eugene

+0

загрузить изображение, вырезать часть изображения, а затем сохранить изображение с холста в файл, базу данных или сервер – kefi

+1

ok я узнал, почему я получаю SECURITY_ERR http://www.whatwg.org/specs/web- apps/current-work/multipage/the-canvas-element.html # security-with-canvas-elements есть способ изменить размер изображения локально, прежде чем отправлять его на веб-сервер, используя JS или некоторую библиотеку sfw для JS? – kefi

ответ

4

Adobe AIR претворяет же происхождение изображений, используемых в брезентовой API. После того, как вы использовали что-то из другого домена в своем холсте, вы не можете получить данные пикселя из него. Однако вы можете использовать класс Loader для получения данных пикселя и преобразовать его в изображение ImageData.

Например:

function getDataURL(url, callback) { 
    var loader = new air.Loader(); 
    loader.contentLoaderInfo.addEventListener(air.Event.COMPLETE, function(event) { 
    var bitmapData = loader.content.bitmapData; 

    var canvas = document.createElement('canvas'); 
    canvas.width = bitmapData.width; 
    canvas.height = bitmapData.height; 
    var context = canvas.getContext('2d'); 
    var imageData = context.createImageData(canvas.width, canvas.height); 

    var dst = imageData.data; 
    var src = bitmapData.getPixels(bitmapData.rect); 
    src.position = 0; 

    var i = 0; 
    while (i < dst.length) { 
     var alpha = src.readUnsignedByte(); 
     dst[i++] = src.readUnsignedByte(); 
     dst[i++] = src.readUnsignedByte(); 
     dst[i++] = src.readUnsignedByte(); 
     dst[i++] = alpha; 
    } 

    context.putImageData(imageData, 0, 0); 
    callback(canvas.toDataURL()); 
    }); 
    loader.load(new air.URLRequest(url)); 
} 

window.addEventListener('load', function() { 
    getDataURL('http://www.google.com/images/logo.gif', function(dataURL) { 
    air.trace(dataURL); 
    }); 
}, false); 
+0

Я пробовал этот код, и я получаю TypeError: значение undefined не позволяет вызвать вызовы функций. ?? – user899641

+0

@ user899641 Это произошло из-за 'trace' вместо' air.trace' - я отредактировал ответ. –

Смежные вопросы