bmp32 转24 android,iOS 用代码如何实现把32位的BMP图片转成24位BMP图片

不多说废话了,直接用代码说话,如你是大神路过勿喷,有错误的还望各位指正,共同学习进步:

/**

*获取由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);

});

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤进行换: 1. 打开24位bmp图像文件,并读取其像素数据。 2. 对于每个像素,将其RGB三个分量取平均值,得到一个灰度值。 3. 将每个灰度值按照8位无符号整数的格式存储到一个unsigned char*数组中。 4. 将该数组写入到一个新的文件中,不包括bmp头。 下面是一个实现的示例代码: ```c++ #include <iostream> #include <fstream> #include <vector> using namespace std; #pragma pack(push, 1) struct BMPHeader { uint16_t type; uint32_t size; uint16_t reserved1; uint16_t reserved2; uint32_t offset; uint32_t header_size; int32_t width; int32_t height; uint16_t planes; uint16_t bit_count; uint32_t compression; uint32_t image_size; int32_t x_pixels_per_meter; int32_t y_pixels_per_meter; uint32_t colors_used; uint32_t important_colors; }; #pragma pack(pop) void write_data(const string& output_file, const unsigned char* data, size_t size) { ofstream out(output_file, ios::out | ios::binary); out.write((const char*)data, size); out.close(); } int main(int argc, char* argv[]) { if (argc < 3) { cout << "Usage: " << argv[0] << " input_file output_file" << endl; return 1; } // 读取BMP文件头 BMPHeader header; ifstream in(argv[1], ios::in | ios::binary); in.read((char*)&header, sizeof(header)); // 读取像素数据 uint32_t data_size = header.width * header.height; vector<unsigned char> pixel_data(data_size * 3); in.read((char*)pixel_data.data(), pixel_data.size()); // 换像素数据格式 vector<unsigned char> gray_data(data_size); for (size_t i = 0; i < data_size; i++) { unsigned char r = pixel_data[i * 3]; unsigned char g = pixel_data[i * 3 + 1]; unsigned char b = pixel_data[i * 3 + 2]; gray_data[i] = (r + g + b) / 3; } // 写入数据 write_data(argv[2], gray_data.data(), gray_data.size()); return 0; } ``` 注意,本示例代码只适用于没有调色板的24位BMP图像。如果图像中使用了调色板,需要根据调色板的颜色信息将每个像素换为对应的颜色索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值