2010-09-08 18 views
5

Czy można używać canvas.toDataURL() w środowisku Adobe AIR?Jak użyć canvas.toDataURL(), aby uzyskać base64 obrazu w Adobe AIR?

Przy próbie pojawia się następujący błąd:

Error: SECURITY_ERR: DOM Exception 18

+0

wyjaśnić należy, co chcesz przez to? może lepiej będzie umieścić to płótno w jakimś innym pojemniku, który będziesz mógł połączyć? – Eugene

+0

Załaduj obraz, wytnij część obrazu, a następnie zapisz obraz z płótna do pliku, bazy danych lub serwera. – kefi

+1

ok. Zrozumiałem, dlaczego dostaję SECURITY_ERR http://www.whatwg.org/specs/web- apps/current-work/multipage/the-canvas-element.html # security-with-canvas-elements Czy istnieje sposób na zmianę rozmiaru obrazu lokalnie przed wysłaniem go na serwer WWW przy użyciu JS lub jakiejś biblioteki sfw dla JS? – kefi

Odpowiedz

4

Adobe AIR wymusza samo pochodzenie dla obrazów wykorzystywanych w API płótnie. Po użyciu czegoś z innej domeny w obszarze roboczym nie można odzyskać danych pikseli. Można jednak skorzystać z klasy Loader, aby pobrać dane piksela i przekonwertować je na canvas ImageData.

Na przykład:

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

Próbowałem tego kodu i otrzymuję TypeError: niezdefiniowana wartość nie zezwala na wywołania funkcji. ?? – user899641

+0

@ user899641 Było to spowodowane 'trace' zamiast' air.trace' - zredagowałem odpowiedź. –