因为安卓跟as3用的channel顺序不同,as3是BGRA ,安卓是RGBA,所以直接将图片传到android会出现色差(非常大的),所以需要转换一下。
代码部分基于Stackoverflow的一个问题的回答,直接拿来用。
final float[] m_bgrToRgbColorTransform =
{
0, 0, 1f, 0, 0,
0, 1f, 0, 0, 0,
1f, 0, 0, 0, 0,
0, 0, 0, 1f, 0
};
完整的代码,将FREBitmapData转换成Bitmap
public static Bitmap getBitmapFromFreBitmapdata(final FREBitmapData as3Bitmap){
//http://stackoverflow.com/questions/17314467/bitmap-channels-order-different-in-android
Bitmap m_encodingBitmap = null;
Canvas m_canvas = null;
Paint m_paint = null;
final float[] m_bgrToRgbColorTransform =
{
0, 0, 1f, 0, 0,
0, 1f, 0, 0, 0,
1f, 0, 0, 0, 0,
0, 0, 0, 1f, 0
};
final ColorMatrix m_colorMatrix = new ColorMatrix(m_bgrToRgbColorTransform);
final ColorMatrixColorFilter m_colorFilter = new ColorMatrixColorFilter(m_colorMatrix);
try{
as3Bitmap.acquire();
int srcWidth = as3Bitmap.getWidth();
int srcHeight = as3Bitmap.getHeight();
m_encodingBitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
m_canvas = new Canvas(m_encodingBitmap);
m_paint = new Paint();
m_paint.setColorFilter(m_colorFilter);
m_encodingBitmap.copyPixelsFromBuffer(as3Bitmap.getBits());
as3Bitmap.release();
}catch (Exception e) {
e.printStackTrace();
Log.d("getBitmapFromFreBitmapdata", "fail to conver image to bitmap");
}
//
// Convert the bitmap from BGRA to RGBA.
//
m_canvas.drawBitmap(m_encodingBitmap, 0, 0, m_paint);
return m_encodingBitmap;
}