社区
图形处理/算法
帖子详情
关于二值图像的数据
菜园子里的PHD
2019-01-26 09:56:00
请问一下一个BMP格式的二值图像的像素是用一个字节表示的还是用一个位表示的呀?如果用一个位表示一个像素,那怎么访问像素呢?
...全文
161
1
打赏
收藏
关于二值图像的数据
请问一下一个BMP格式的二值图像的像素是用一个字节表示的还是用一个位表示的呀?如果用一个位表示一个像素,那怎么访问像素呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
schlafenhamster
2019-01-27
打赏
举报
回复
参考
/*参数说明:
*strSrc——源文件(8位bmp灰度图)
*strDst——目标文件(1位bmp二值图) // 一字节 8个 点
*threshold——阈值
*/
BOOL GraytoBinary(const char *strSrc, const char *strDst, const int threshold)
{
BITMAPFILEHEADER fileheader; //文件头
BITMAPINFOHEADER bmpinfo; //信息头
FILE *fSrc; //源文件(灰度图)
fSrc=fopen(strSrc,"rb");
if( !fSrc )
{
return false;
}
fread(&fileheader, sizeof(BITMAPFILEHEADER), 1, fSrc); //读取源文件的文件头
fread(&bmpinfo, sizeof(BITMAPINFOHEADER), 1, fSrc); //读取源文件的信息头
// const int SecBPP = 8 / bmpinfo.biBitCount; //源文件每字节的像素数
const int SrcBitCount = bmpinfo.biBitCount; //源文件的位深
const int SrcRowLen = (((bmpinfo.biWidth * bmpinfo.biBitCount + 31)/8)/4)*4; // 520 源文件每行字节数
const int SrcClrNum = bmpinfo.biClrUsed ? bmpinfo.biClrUsed : 256 ; //原图像颜色表个数(8位256色)
// read src colors !
// RGBQUAD SrcClr[256];
// fread(SrcClr,sizeof(RGBQUAD),SrcClrNum,fSrc);
// or seek to data
fseek(fSrc,sizeof(RGBQUAD)*SrcClrNum,SEEK_CUR);
//修改文件信息为:目标文件信息
bmpinfo.biBitCount = 1; //二值图的位深
bmpinfo.biClrImportant = 0; //所有颜色都很重要
bmpinfo.biClrUsed = 2; //有2个颜色表
bmpinfo.biCompression = 0; //不压缩
const int DstBPP = 8;
//二值图每字节的像素数
const int DstRowLen = (((bmpinfo.biWidth * bmpinfo.biBitCount + 31)/8)/4)*4;// 68 二值图每行字节数
fileheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
2*sizeof(RGBQUAD) + bmpinfo.biHeight*DstRowLen; //二值图的文件大小
fileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
2*sizeof(RGBQUAD); //二值图的位图数据偏移量
bmpinfo.biSizeImage = bmpinfo.biHeight * DstRowLen; //二值图的图像数据大小
//创建目标文件
FILE *fDst;
fDst=fopen(strDst,"wb");
if( !fDst )
{
return false;
}
fwrite(&fileheader, sizeof(BITMAPFILEHEADER), 1, fDst); // 写入二值图文件头
fwrite(&bmpinfo, sizeof(BITMAPINFOHEADER), 1, fDst); // 写入二值图信息头
RGBQUAD clrDst[2]; //临时变量:原图像(8位)颜色表 与 目标图像(1位)颜色表
//clrDst[2]数组存储具体的颜色信息,二值图数据部分存储的是数组下标
clrDst[0].rgbBlue = 0;
clrDst[0].rgbGreen = 0;
clrDst[0].rgbRed = 0;
clrDst[0].rgbReserved = 0; // 0 表示 黑色
clrDst[1].rgbBlue = 255;
clrDst[1].rgbGreen = 255;
clrDst[1].rgbRed = 255;
clrDst[1].rgbReserved = 0; // 1 表示 白色
for(int ii = 0; ii < 2; ii++)
{
fwrite(&clrDst[ii],sizeof(RGBQUAD),1,fDst); //将颜色表写入目标文件
}
BYTE *bufSrc = new BYTE[SrcRowLen]; //源文件(灰度图)存放一行像素的缓冲区
BYTE *bufDst = new BYTE[DstRowLen]; //目标文件(二值图)存放一行像素的缓冲区
for(int i = 0; i < bmpinfo.biHeight; i++)
{
fread(bufSrc,SrcRowLen,1,fSrc); //读取源文件(8位位图)第i行数据
memset(bufDst,0,DstRowLen); //将目标文件(二值图)第i行数据清零
for(int j = 0; j < bmpinfo.biWidth; j++)
{
int index = j / DstBPP;
//从源文件每读8字节,目标文件增加一字节
int nShift = 8 - (j % DstBPP + 1 ) * bmpinfo.biBitCount; //moved bit
// nShift = 7 6 5 4 3 2 1
if(bufSrc[j] < threshold)
bufDst[index] &= ~(1 << nShift);// =0
else
bufDst[index] |= (1 << nShift);// =1
}
fwrite(bufDst, DstRowLen, 1, fDst); // write this row
}
//
fclose(fSrc);
fclose(fDst);
//
delete []bufSrc;
delete []bufDst;
return true;
}
// GraytoBinary("Girl8.bmp", "Girl2.bmp",28);//
Apgrecp.rar
欢迎下载缺少的CAD字体,避免打开图纸时因字体缺失而出现乱码或文字消失。
定时任务卸数,上传
数据
-下载即用.zip
代码转载自:https://pan.quark.cn/s/a4b39357ea24 gocron - 定时任务管理系统 Downloads license Release 项目简介 使用Go语言开发的轻量级定时任务集中调度和管理系统, 用于替代Linux-crontab 查看文档 原有的延时任务拆分为独立项目延迟队列 功能特性 Web界面管理定时任务 crontab时间表达式, 精确到秒 任务执行失败可重试 任务执行超时, 强制结束 任务依赖配置, A任务完成后再执行B任务 账户权限控制 任务类型 * shell任务 在任务节点上执行shell命令, 支持任务同时在多个节点上运行 * HTTP任务 访问指定的URL地址, 由调度器直接执行, 不依赖任务节点 查看任务执行结果日志 任务执行结果通知, 支持邮件、Slack、Webhook 截图 流程图 任务 Slack 支持平台 Windows、Linux、Mac OS 环境要求 MySQL 下载 releases 版本升级 安装 二进制安装 解压压缩包 启动 调度器启动 * Windows: * Linux、Mac OS: 任务节点启动, 默认监听0.0.0.0:5921 * Windows: * Linux、Mac OS: 浏览器访问 http://localhost:5920 源码安装 安装Go 1.11+ 编译 启动 * gocron * gocron-node docker 配置: /app/conf/app.ini 日志: /app/log/cron.log 镜像不包含gocron-node, gocron-node需要和具体业务一起构建 开发 安装Go1.9+, Node.js, Yarn 安装前端...
【Windows驱动开发】基于OpenClaw框架的内核级AI智能体系统设计:实现硬件管控与全离线自动化
内容概要:本文系统讲解了OpenClaw Windows驱动开发的完整流程,旨在通过自研内核驱动扩展OpenClaw AI智能体框架的能力边界。文章从架构原理入手,介绍用户态与内核态协同的双层设计,阐述驱动在权限突破、硬件控制、系统级自动化等方面的核心价值。随后详细说明开发环境搭建、项目工程创建、核心模块设计(设备管理、IOCTL通信、内核执行、安全校验)及关键代码实现,并提供可运行的驱动模板。进一步涵盖驱动的编译签名、部署加载、调试优化方法,结合实战案例展示AI驱动的底层系统自动化应用,如进程管控、垃圾清理和硬件监控,最终总结开发要点与避坑指南。; 适合人群:具备Windows系统编程基础、熟悉C/C++和驱动开发的中高级研发人员,尤其是从事AI自动化、系统安全、底层运维相关工作的开发者。; 使用场景及目标:①实现OpenClaw在受限权限下的深度系统控制;②构建高可靠性、防检测的本地AI智能体控制系统;③开展硬件级自动化调度与企业终端统一管控; 阅读建议:此资源涉及内核级开发,操作风险较高,建议在虚拟机环境中进行测试,严格按照步骤配置开发与调试环境,重点关注安全校验与异常处理机制,确保驱动稳定性与系统安全性。
Canon E568驱动
Canon E568驱动
ARCHTITL.rar
欢迎下载缺少的CAD字体,避免打开图纸时因字体缺失而出现乱码或文字消失。
图形处理/算法
19,466
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章