标签:int bitmap ++ RGB888 0xff argb 像素点 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。