linux下将8bit二值位图转化为1bit单色位图【C/C++】
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++】相关推荐
- python + pyqt +opencv 有界面,对lable中的图片进行图像旋转,向右平移,向下平移,二值化,灰度,边缘检测
对lable中的图片进行图像旋转,向右平移,向下平移,二值化,灰度,边缘检测 要求: 一个界面,具体界面内容自行设计但必须符合以下要求 多个操作按钮: 1.图像180°旋转 2.图像向右平移 3.图像 ...
- Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量
<semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...
- linux如何拿到文件的返回值,linux 下read函数返回值分析
原文出处:http://blog.chinaunix.net/space.php?uid=20558494&do=blog&id=2803003 read函数是Linux下不带缓存的文 ...
- gdb 调试_一文入门Linux下gdb调试(二)
点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dum ...
- linux gdb网络调试,一文入门Linux下gdb调试(二)
本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...
- 数字图像处理——二值、灰度和彩色图像,位图切割
二值.灰度和彩色图像处理 1. 二值.灰度图像的转换 2. 彩色图像的表示 3. 位图切割 -------------------------- -------------------------- ...
- linux版本kettle 中文乱码,kettle工具同步数据乱码-Linux下乱码问题二
json校验 直接百度:json在线解析 或 json.cnhttp://json.cn/ json格式校验的.这个更加简洁些. SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是 ...
- linux下验证软件MD5值
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改. MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一 ...
- linux下的ping脚本,Linux下检测服务器Ping值的Shell脚本
这个月我们连续增加了4台国外服务器,让每台服务器的负载更低一些,这样网民和搜索引擎访问更顺畅,利于流量和广告收入的提升. 我今年早几个月曾经在网上找了一段检测Ping的代码,稍微改了一下适应我们的需要 ...
最新文章
- Python爬虫之破解百度翻译--requests案例详解(一)
- git记住用户名和密码
- MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...
- python控制gpio的一段代码抄的
- linux mysql libc.so_mysql-arm-linux-gcc编译报错:libc.soformatnotrecognized.
- boost::promise相关的测试程序
- 我的世界服务器修改成创造,我的世界怎么创建领域
- NOI导刊模拟2—电话网络 解题报告
- 带有下标的赋值维度不匹配是什么意思_三言两语说清TensorFlow是什么?拿来干嘛的?...
- jquery 判断元素可见性
- 快速批量一个半小时插入1亿条数据到mysql
- 三菱Q系列PLC基本指令讲解
- 高级启动选项重装计算机,如何使用高级选项重装win10系统?重装win10系统方法...
- Friendship 友谊--我最宝贵的财富
- Excel单元格数据有空格怎样去掉
- Laravel 第十章 API测试和文档
- Android 自带的返回键功能
- java学习之服务器第28天( --jsp--三个指令--六个动作标签--PageContext域--EL表达式--)
- ArcMap中Shapefile和dBASE文件的创建与管理
- windows系统有线连接网络,再连入wify后,优先使用wify
热门文章
- 多核cpu的缓存一致性
- API接口开发其实特简单,Python Flask Web 框架教程来了
- 天龙八部服务端Lua脚本系统(转)
- 【系统运维-Linux】使用U盘安装Linux
- 权威披露2014微信十大最火谣言 | 调查称女性最爱传谣,你服不服?
- 2021湖南高考成绩查询考生版,湖南省普通高校招生考试考生综合信息平台入口2021...
- Microsoft Word 教程「4」,如何在 Word 中应用样式、主题?
- AirPods 3和AirPods Pro 哪个值得入手 两者配置对比
- linux系统硬盘坏了,linux 系统 如何检测 磁盘 是否损坏?
- Java--网上银行登录及存取款业务模拟系统