Порядок растровых каналов различен в 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);

...

}

Надеюсь, что это помогает... Тимм

Другие вопросы по тегам