我試圖使用copyPixelsToBuffer
和和copyPixelsFromBuffer
方法訪問Android上ARGB_8888格式的位圖原始數據。但是,調用這些調用似乎總是將alpha通道應用於rgb通道。我需要一個byte []或類似的原始數據(通過JNI;是的,我知道Android 2.2中的bitmap.h,不能使用它)。訪問ARGB_8888中的原始數據Android位圖
下面是一個示例:
// Create 1x1 Bitmap with alpha channel, 8 bits per channel
Bitmap one = Bitmap.createBitmap(1,1,Bitmap.Config.ARGB_8888);
one.setPixel(0,0,0xef234567);
Log.v("?","hasAlpha() = "+Boolean.toString(one.hasAlpha()));
Log.v("?","pixel before = "+Integer.toHexString(one.getPixel(0,0)));
// Copy Bitmap to buffer
byte[] store = new byte[4];
ByteBuffer buffer = ByteBuffer.wrap(store);
one.copyPixelsToBuffer(buffer);
// Change value of the pixel
int value=buffer.getInt(0);
Log.v("?", "value before = "+Integer.toHexString(value));
value = (value >> 8) | 0xffffff00;
buffer.putInt(0, value);
value=buffer.getInt(0);
Log.v("?", "value after = "+Integer.toHexString(value));
// Copy buffer back to Bitmap
buffer.position(0);
one.copyPixelsFromBuffer(buffer);
Log.v("?","pixel after = "+Integer.toHexString(one.getPixel(0,0)));
日誌然後顯示
hasAlpha() = true
pixel before = ef234567
value before = 214161ef
value after = ffffff61
pixel after = 619e9e9e
據我所知,ARGB信道的順序不同;沒關係。但我不想 希望alpha通道應用於每個副本(這是它似乎在做什麼)。
這是copyPixelsToBuffer
和copyPixelsFromBuffer
應該如何工作?有沒有任何方式獲得一個字節[]中的原始數據?
添加響應如下回答:
的copyPixelsToBuffer
前buffer.order(ByteOrder.nativeOrder());
把不會改變結果,但仍然沒有在路上我希望它:
pixel before = ef234567
value before = ef614121
value after = ffffff41
pixel after = ff41ffff
似乎從本質上遭受同樣的問題(每個copyPixelsFrom/ToBuffer
都應用了alpha)。
嗨,我也遇到過這個問題。你找到了解決這個問題的方法嗎?也許將數據轉換回真RGB值的方法? – 2012-09-07 00:51:27
您可能也想檢查``Bitmap.isPremultiplied()``。當alpha通道出現時,默認情況下它默認設置爲「true」。 – harism 2013-01-12 18:51:46