RGB888 转 RGB565
作者:互联网
Android 的坑
ByteBuffer buffer = ByteBuffer.allocate(mPreset.getCoverImg().getByteCount());
mPreset.getCoverImg().copyPixelsToBuffer(buffer);
mPixelBuf = buffer.array(); 获取的像素点数据组合出来会失真
下面是不失真的做法
int w = bitmap.getWidth(); int h = bitmap.getHeight(); // Bitmap bitmap2 = Bitmap.createBitmap(w , h , Bitmap.Config.ARGB_8888); for(int i = 0 ; i < h ; i++) for(int j = 0 ; j < w; j ++) { // 获取每个像素点 int argb = bitmap.getPixel(j , i ); int r =( argb>>16)&0xff; int g =( argb>>8)&0xff; int b =argb&0xff; //一个个点转换 取R前5位 G前 6位 B前5位 组合成16位 的一个像素点 headData[data_len++] = (byte) (((r & 0xf8) | (g >>5 )) & 0xff); headData[data_len++] = (byte) ((((g << 3) & 0xE0) |( b >> 3)) & 0xff); // int a =(argb>>24)&0xff; // System.out.println("a的值:"+a); // int rgb =((a*256+r) * 256 + g) * 256 + b; // bitmap2.setPixel(j , i , rgb); }
iOS
CGImageRef imImage = image.CGImage; CFDataRef mDataRef = CGDataProviderCopyData(CGImageGetDataProvider(imImage)); UInt8 *mPixelBuf = (UInt8 *)CFDataGetBytePtr(mDataRef); CFIndex length = CFDataGetLength(mDataRef); for(int i=0;i<length;i+=4){ int r = i; int g = i+1; int b = i+2; int red = mPixelBuf[r]; int green = mPixelBuf[g]; int blue = mPixelBuf[b]; // int a = mPixelBuf[i+3]; // RGB565是这样算出来的: 16位 RGB 转2进制。R取5位,G取6位,B取5位。然后结合起来转成16进制即可。 // 例如:rgb(105,105,105) // 转成2进制:为1101001,1101001,1101001 // 取前5,6,5位:11010,110100,11010 // 结合起来转成16进制:d69a headData[data_len++] = (red & 0xf8) | (green >>5 ); headData[data_len++] = ((green << 3) & 0xE0) |( blue >> 3) ; }
标签:int,bitmap,++,RGB888,0xff,argb,像素点,RGB565 来源: https://www.cnblogs.com/zhujin/p/16320225.html