Порядок растровых каналов различен в Android
У меня проблема с расширением Air Native в Android.
ANE получает Bitmap со стороны Actionscript, сжимает его в формате jpeg и отправляет обратно в Actionscript, который запишет его в хранилище.
Все хорошо, но последнее.
Кажется, что порядок каналов для Actionscript отличается от порядка в Android, поэтому мое сжатое изображение имеет КРАСНЫЕ цвета вместо СИНЕГО... вот код:
Actionscript (я использую библиотеку deng.fzip.FZipLibrary для получения растрового изображения из zip-пакета)
__image = __fl.getBitmapData(path);
__de = new DataExchange();
__ba = __de.bitmapEncode(__image) as ByteArray;
Android
...
try {
inputValue = (FREBitmapData)arg1[0];
inputValue.acquire();
int srcWidth = inputValue.getWidth();
int srcHeight = inputValue.getHeight();
Bitmap bm = Bitmap.createBitmap(srcWidth, srcHeight, Config.ARGB_8888);
bm.copyPixelsFromBuffer(inputValue.getBits());
ByteArrayOutputStream os = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 80, os);
compressed = os.toByteArray();
inputValue.release();
} catch (Exception e) {
e.printStackTrace();
}
try {
returnValue = FREByteArray.newByteArray();
returnValue.setProperty("length", FREObject.newObject(compressed.length));
returnValue.acquire();
ByteBuffer returnBytes = returnValue.getBytes();
returnBytes.put(compressed, 0, compressed.length);
returnValue.release();
}
...
У кого-нибудь есть идея о том, как преобразовать красный в синий цвет на стороне Android перед отправкой изображения обратно? Или это нужно сделать на стороне ActionScript?
Большое спасибо и всего наилучшего,
Gianpiero
1 ответ
Вы можете переключать цвета следующим образом:
(Этот код не от меня, к сожалению, я забыл, где я его нашел, поэтому кредит идет куда-то еще)
private Bitmap m_encodingBitmap = null;
private Canvas m_canvas = null;
private Paint m_paint = null;
private final float[] m_bgrToRgbColorTransform =
{
0, 0, 1f, 0, 0,
0, 1f, 0, 0, 0,
1f, 0, 0, 0, 0,
0, 0, 0, 1f, 0
};
private final ColorMatrix m_colorMatrix = new ColorMatrix(m_bgrToRgbColorTransform);
private final ColorMatrixColorFilter m_colorFilter = new ColorMatrixColorFilter(m_colorMatrix);
...
try{
FREBitmapData as3Bitmap = (FREBitmapData)args[0];
as3Bitmap.acquire();
m_encodingBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
m_canvas = new Canvas(m_encodingBitmap);
m_paint = new Paint();
m_paint.setColorFilter(m_colorFilter);
m_encodingBitmap.copyPixelsFromBuffer(as3BitmapBytes);
as3Bitmap.release();
//
// Convert the bitmap from BGRA to RGBA.
//
m_canvas.drawBitmap(m_encodingBitmap, 0, 0, m_paint);
...
}
Надеюсь, что это помогает... Тимм