不多说废话了,直接用代码说话,如你是大神路过勿喷,有错误的还望各位指正,共同学习进步:
/**
*获取由32位的BMP位图NSData数据转换得到24位的BMP位图NSData数据
*在子线程执行任务,执行完后使用block回调
*
*
*特别说明:传进来的参数和返回的数据都是不包括位图的头部文件Bitmap file header的
*我这里是根据硬件那边的需要,已经把格式规定死了,是一个width*height->480*800大小的BMP图片
*这个方法是使用block的回到
*
*@param bitmap_32bit_data32位的BMP位图NSData数据
*@param ConvertBitmapBlock 24位的BMP位图NSData数据
*
*
*实例:
*32位的一个像素点数值是:123150ff --->传入参数
*去掉alpha值后得到24位的一个像素点,其数值是:123150
*然后将得到的24位像素点的数值转换成需要发送的数据类型即NSData类型
*NSData里面的bytes存储的就是“123150”这个字符串每个数字对应的ASCII码49 50 51 49 53 48
*的十六进制数31 32 33 31 35 30。
*/
+ (void)convertBitmap_24bit_dataWithBitmap_32bit_data:(NSData*)bitmap_32bit_data
blockCompletion:(ConvertBitmap24bitData)ConvertBitmapBlock{
if(bitmap_32bit_data ==nil) {
return;
}
//获取系统创建的主队列,主队列的生命周期跟进程的一致
dispatch_queue_tglobalQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_async(globalQueue, ^{
NSString*perPixelString = [NSStringstring];
NSData*tempData = [NSDatadata];
NSMutableData*bitmap_24bit_mdata = [NSMutableDatadata];
constunsignedchar*p = [bitmap_32bit_databytes];
intflag =0;
for(inti =0; i < [bitmap_32bit_datalength]; i++) {
if(flag ==3) {
p++;
flag =0;
}else{
flag++;
perPixelString = [NSStringstringWithFormat:@"%02x",*p++];
tempData = [ConversionToolconvertNSDataFromHexString:perPixelString];
[bitmap_24bit_mdataappendData:tempData];
}
}
ConvertBitmapBlock(bitmap_24bit_mdata);
});
}