linux下将8bit二值位图转化为1bit单色位图

bmp位图主要由文件头和信息头两部分,根据windows api下bmp结构体定义,可转化为以下linux可用的结构体(禁用了gcc/g++编译器优化,考虑字节对齐)。配合opencv,将bmp数据处理并写入文件中。详细见以下代码实现:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>//Mat g_srcImage, g_dstImage, g_tmpImage;
//-----------------------------------【命名空间声明部分】--------------------------------------
//      描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace std;
using namespace cv;//14byte文件头
typedef  struct  _tagBITMAPFILEHEADER
{unsigned short     bfType;             //位图文件的类型,必须为BM unsigned int       bfSize;               //文件大小,以字节为单位unsigned short      bfReserverd1;       //位图文件保留字,必须为0 unsigned short        bfReserverd2;       //位图文件保留字,必须为0 unsigned int       bfbfOffBits;       //位图文件头到数据的偏移量,以字节为单位
} __attribute__((packed)) _BITMAPFILEHEADER;//使编译器不优化,其大小为14字节//40byte信息头
typedef  struct  _tagBITMAPINFOHEADER
{unsigned int biSize;                        //该结构大小,字节为单位int  biWidth;                              //图形宽度以象素为单位int  biHeight;                              //图形高度以象素为单位unsigned short biPlanes;                    //目标设备的级别,必须为1 unsigned short biBitcount;                    //颜色深度,每个象素所需要的位数unsigned int biCompression;                 //位图的压缩类型unsigned int biSizeImage;                      //位图的大小,以字节为单位int  biXPelsPermeter;                      //位图水平分辨率,每米像素数int  biYPelsPermeter;                     //位图垂直分辨率,每米像素数unsigned int biClrUsed;                       //位图实际使用的颜色表中的颜色数unsigned int biClrImportant;                   //位图显示过程中重要的颜色数
} __attribute__((packed))  _BITMAPINFOHEADER;   //使编译器不优化,其大小为40字节typedef  struct
{_BITMAPFILEHEADER  file; //文件信息区_BITMAPINFOHEADER  info; //图象信息区
} __attribute__((packed)) _bmp;void write_monochrome_bitmap_file(const char* szSrcPath, const char *szDesPath)
{_bmp  m = { 0 };        //定义一个位图结构FILE *fp;IplImage * temp = cvLoadImage(szSrcPath, 0);fp = fopen(szDesPath, "wb+");if (NULL == fp){printf("can't open the bmp imgae.\n");exit(0);}int widthStep = 0;widthStep = ((temp->width + 31) / 32) * 4;//写入文件头m.file.bfType = 0X4D42;m.file.bfSize = widthStep * temp->height + 62;       //文件大小,数据大小+文件头大小m.file.bfReserverd1 = 0;m.file.bfReserverd2 = 0;m.file.bfbfOffBits = 62;//写入信息头m.info.biSize = 40;m.info.biWidth = temp->width;m.info.biHeight = temp->height;m.info.biPlanes = 1;m.info.biBitcount = 1;m.info.biCompression = 0;m.info.biSizeImage = widthStep * temp->height;m.info.biXPelsPermeter = 0;m.info.biClrUsed = 0;m.info.biClrImportant = 0;fseek(fp, 0, SEEK_SET);fwrite(&(m.file.bfType), sizeof(m.file.bfType), 1, fp);fseek(fp, 2, SEEK_SET);fwrite(&(m.file.bfSize), sizeof(m) - 2, 1, fp);//54-62共八个字节表示调色板信息uchar Palette[8] = { 0,0,0,0,255,255,255,0 };//fseek(fp, 54, SEEK_SET);fwrite(Palette, sizeof(uchar), 8, fp);uchar* data = new uchar[widthStep*temp->height];memset(data, 0, widthStep*temp->height);//单色位图,1表示白色,0表示黑色,结果图背景为白(1),线条为黑(0)for (int i = 0; i < temp->height; i++){for (int j = 0; j < widthStep; j++){uchar temp_data = 0;for (int k = 0; k < 8; k++){if (j * 8 + k < temp->width){int temp_value = 0;//阈值设为150if ((uchar)temp->imageData[(temp->height - 1 - i)*temp->widthStep + j * 8 + k] > 150){temp_value = 1 << (7 - k);temp_data += temp_value;}}}data[i*widthStep + j] = temp_data;}}fseek(fp, 62, SEEK_SET);fwrite(data, sizeof(uchar), widthStep*temp->height, fp);cvReleaseImage(&temp);temp = nullptr;delete[] data;data = NULL;fclose(fp);fp = NULL;
}

linux下将8bit二值位图转化为1bit单色位图【C/C++】相关推荐

  1. python + pyqt +opencv 有界面,对lable中的图片进行图像旋转,向右平移,向下平移,二值化,灰度,边缘检测

    对lable中的图片进行图像旋转,向右平移,向下平移,二值化,灰度,边缘检测 要求: 一个界面,具体界面内容自行设计但必须符合以下要求 多个操作按钮: 1.图像180°旋转 2.图像向右平移 3.图像 ...

  2. Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量

    <semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...

  3. linux如何拿到文件的返回值,linux 下read函数返回值分析

    原文出处:http://blog.chinaunix.net/space.php?uid=20558494&do=blog&id=2803003 read函数是Linux下不带缓存的文 ...

  4. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  5. linux gdb网络调试,一文入门Linux下gdb调试(二)

    本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...

  6. 数字图像处理——二值、灰度和彩色图像,位图切割

    二值.灰度和彩色图像处理 1. 二值.灰度图像的转换 2. 彩色图像的表示 3. 位图切割 -------------------------- -------------------------- ...

  7. linux版本kettle 中文乱码,kettle工具同步数据乱码-Linux下乱码问题二

    json校验 直接百度:json在线解析  或  json.cnhttp://json.cn/ json格式校验的.这个更加简洁些. SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是 ...

  8. linux下验证软件MD5值

    MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.     MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一 ...

  9. linux下的ping脚本,Linux下检测服务器Ping值的Shell脚本

    这个月我们连续增加了4台国外服务器,让每台服务器的负载更低一些,这样网民和搜索引擎访问更顺畅,利于流量和广告收入的提升. 我今年早几个月曾经在网上找了一段检测Ping的代码,稍微改了一下适应我们的需要 ...

最新文章

  1. Python爬虫之破解百度翻译--requests案例详解(一)
  2. git记住用户名和密码
  3. MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...
  4. python控制gpio的一段代码抄的
  5. linux mysql libc.so_mysql-arm-linux-gcc编译报错:libc.soformatnotrecognized.
  6. boost::promise相关的测试程序
  7. 我的世界服务器修改成创造,我的世界怎么创建领域
  8. NOI导刊模拟2—电话网络 解题报告
  9. 带有下标的赋值维度不匹配是什么意思_三言两语说清TensorFlow是什么?拿来干嘛的?...
  10. jquery 判断元素可见性
  11. 快速批量一个半小时插入1亿条数据到mysql
  12. 三菱Q系列PLC基本指令讲解
  13. 高级启动选项重装计算机,如何使用高级选项重装win10系统?重装win10系统方法...
  14. Friendship 友谊--我最宝贵的财富
  15. Excel单元格数据有空格怎样去掉
  16. Laravel 第十章 API测试和文档
  17. Android 自带的返回键功能
  18. java学习之服务器第28天( --jsp--三个指令--六个动作标签--PageContext域--EL表达式--)
  19. ArcMap中Shapefile和dBASE文件的创建与管理
  20. windows系统有线连接网络,再连入wify后,优先使用wify

热门文章

  1. 多核cpu的缓存一致性
  2. API接口开发其实特简单,Python Flask Web 框架教程来了
  3. 天龙八部服务端Lua脚本系统(转)
  4. 【系统运维-Linux】使用U盘安装Linux
  5. 权威披露2014微信十大最火谣言 | 调查称女性最爱传谣,你服不服?
  6. 2021湖南高考成绩查询考生版,湖南省普通高校招生考试考生综合信息平台入口2021...
  7. Microsoft Word 教程「4」,如何在 Word 中应用样式、主题?
  8. AirPods 3和AirPods Pro 哪个值得入手 两者配置对比
  9. linux系统硬盘坏了,linux 系统 如何检测 磁盘 是否损坏?
  10. Java--网上银行登录及存取款业务模拟系统