2010-09-08 15 views
5

È possibile utilizzare canvas.toDataURL() in Adobe AIR?Come usare canvas.toDataURL() per ottenere base64 dell'immagine in Adobe AIR?

Quando provo ottengo il seguente errore:

Error: SECURITY_ERR: DOM Exception 18

+0

spiegare per favore, che cosa vuoi da questo? forse sarà meglio mettere questa tela in un altro contenitore, che potrai collegare? – Eugene

+0

caricare un'immagine, tagliare una parte dell'immagine e quindi salvare l'immagine dalla tela in un file, database o server – kefi

+1

ok ho scoperto perché ottengo SECURITY_ERR http://www.whatwg.org/specs/web- app/current-work/multipage/the-canvas-element.html # security-with-canvas-elements esiste un modo per ridimensionare l'immagine localmente prima di inviarla al webserver usando JS o qualche libreria sfw per JS? – kefi

risposta

4

Adobe AIR applica stessa origine per le immagini utilizzate nelle API tela. Una volta che hai usato qualcosa da un altro dominio nella tua tela, non puoi recuperare i dati dai pixel. Tuttavia, è possibile utilizzare la classe Loader per ottenere i dati dei pixel e convertirli in un ImageData su tela.

Ad esempio:

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

Ho provato questo codice e ottengo un errore TypeE: il valore undefined non consente le chiamate di funzione. ?? – user899641

+0

@ user899641 Ciò era dovuto a 'trace' invece di' air.trace' - Ho modificato la risposta. –

Problemi correlati