I got idea from canvas2image.js(
http://www.nihilogic.dk/labs/canvas2image/). So I wrote a JSNI methods as below:
public native String getImageData(int left, int top, int width, int height) /*-{
var oData = this.@com.messenger.client.framework.Canvas::context.getImageData(left, top, width, height);
var aImgData = oData.data;
var strPixelData = "";
var y = height;
var iPadding = (4 - ((width * 3) % 4)) % 4;
do {
var iOffsetY = width*(y-1)*4;
var strPixelRow = "";
for (var x=0;x<width;x++) {
var iOffsetX = 4*x;
if (aImgData[iOffsetY+iOffsetX+2] == 0 &&
aImgData[iOffsetY+iOffsetX+1] == 0 &&
aImgData[iOffsetY+iOffsetX] == 0) {
strPixelRow += String.fromCharCode(255);
strPixelRow += String.fromCharCode(255);
strPixelRow += String.fromCharCode(255);
} else {
strPixelRow += String.fromCharCode(aImgData[iOffsetY+iOffsetX+2]);
strPixelRow += String.fromCharCode(aImgData[iOffsetY+iOffsetX+1]);
strPixelRow += String.fromCharCode(aImgData[iOffsetY+iOffsetX]);
}
}
for (var c=0;c<iPadding;c++) {
strPixelRow += String.fromCharCode(0);
}
strPixelData += strPixelRow;
} while (--y);
return strPixelData;
}-*/;
As above method, I got a raw data in String object. So I need another method to convert it to byte array. Here it is:
public byte[] getBitmap() {
String str = getImageData(0, 0, width, height);
byte[] ar = new byte[str.length()];
for (int i=0; i<ar.length; i++)
ar[i] = (byte)((int)str.charAt(i) & 0xff);
return ar;
}
Hope this is helpful.
Kevin