其他分享
首页 > 其他分享> > RGB888 转 RGB565

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