我正在尝试将具有 ARGB_8888 格式的位图转换为需要在应用程序的本机部分中使用的单通道字节数组。
我使用
int pixel = bitmap.getPixel(x,y);
int redValue = Color.red(pixel);
int blueValue = Color.blue(pixel);
int greenValue = Color.green(pixel);
int alphaValue = Color.alpha(pixel);
而且看起来格式实际上是RGBA而不是ARGB。
我用下面的代码来完成这个任务
public static byte[] bitmapToByteArray(Bitmap bm) {
// Create the buffer with the correct size
int iBytes = bm.getWidth() * bm.getHeight() ;
byte[] res = new byte[iBytes];
Bitmap.Config format = bm.getConfig();
if (format == Bitmap.Config.ARGB_8888)
{
ByteBuffer buffer = ByteBuffer.allocate(iBytes*4);
// Log.e("DBG", buffer.remaining()+""); -- Returns a correct number based on dimensions
// Copy to buffer and then into byte array
bm.copyPixelsToBuffer(buffer);
byte[] arr = buffer.array();
for(int i=0;i<iBytes;i++)
{
int A,R,G,B;
R=(int)(arr[i*4+0]) & 0xff;
G=(int)(arr[i*4+1]) & 0xff;
B=(int)(arr[i*4+2]) & 0xff;
//A=arr[i*4+3];
byte r = (byte)(0.2989 * R + 0.5870 * G + 0.1140 * B) ;
res[i] = r;
}
}
if (format == Bitmap.Config.RGB_565)
{
ByteBuffer buffer = ByteBuffer.allocate(iBytes*2);
// Log.e("DBG", buffer.remaining()+""); -- Returns a correct number based on dimensions
// Copy to buffer and then into byte array
bm.copyPixelsToBuffer(buffer);
byte[] arr = buffer.array();
for(int i=0;i<iBytes;i++)
{
float A,R,G,B;
R = ((arr[i*2+0] & 0xF8) );
G = ((arr[i*2+0] & 0x7) << 5) + ((arr[i*2+1] & 0xE0) >> 5);
B = ((arr[i*2+1] & 0x1F) << 3 );
byte r = (byte)(0.2989 * R + 0.5870 * G + 0.1140 * B) ;
res[i] = r;
}
}
// Log.e("DBG", buffer.remaining()+""); -- Returns 0
return res;
}
}
出于调试原因,正在将字节数组发送到远程服务器。当我在服务器中重建位图时,我得到的图像都是像素化的,并且灰度值很奇怪。知道我做错了什么吗?任何评论将不胜感激。谢谢