我想实现通过修改bmp的数据区域的数据,在指定的部位画个矩形框

我看你有戏 2014-10-21 08:09:22
我想实现通过修改bmp的数据区域的数据,在指定的部位画个矩形框
就这么说吧,我把一张bmp图片导入到内存里面
已知指针 P,长度nsize

希望通过用P指针进行操作这个BMP的图像,在指定的某个区域,比如(10,10,20,30)这样的一个区域画一个矩形框
操作好以后保存到文件
希望直接通过字节来处理,不要用图片处理的库
...全文
156 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
我看你有戏 2014-10-21
  • 打赏
  • 举报
回复
第三个字节是R吧
勤奋的小游侠 2014-10-21
  • 打赏
  • 举报
回复
引用 4 楼 henry3695 的回复:
[quote=引用 3 楼 lovesmiles 的回复:] 给个学习流程: 1 先搜bmp文件格式,学习bmp的文件头。 2 定义好bmp文件头的结构体后,用fopen打开文件 3 读取数据内容,自己计算要修改那些点的值 4 修改好后将文件头和数据重新写入文件。
现在的问题就是这个点要怎么转换啊 文件头,文件数据啥的我是可以区分清楚了的 关键是点的转换比较晕 我的这个是24位的bmp图片 [/quote] 在文件头有长w和宽h的信息。24位的就是一个像素占3个字节。 这样你就可以将数据当作一个数组来使用了,要访问第(x,y)可以以这样访问: byte* data = pDatabuff; data[x*w + y *3] R data[x*w + y *3+1] G data[x*w + y *3+2] B
我看你有戏 2014-10-21
  • 打赏
  • 举报
回复
引用 3 楼 lovesmiles 的回复:
给个学习流程: 1 先搜bmp文件格式,学习bmp的文件头。 2 定义好bmp文件头的结构体后,用fopen打开文件 3 读取数据内容,自己计算要修改那些点的值 4 修改好后将文件头和数据重新写入文件。
现在的问题就是这个点要怎么转换啊 文件头,文件数据啥的我是可以区分清楚了的 关键是点的转换比较晕 我的这个是24位的bmp图片
勤奋的小游侠 2014-10-21
  • 打赏
  • 举报
回复
给个学习流程: 1 先搜bmp文件格式,学习bmp的文件头。 2 定义好bmp文件头的结构体后,用fopen打开文件 3 读取数据内容,自己计算要修改那些点的值 4 修改好后将文件头和数据重新写入文件。
幻夢之葉 2014-10-21
  • 打赏
  • 举报
回复

// BMP头
typedefstructtagBITMAPFILEHEADER
{
WORDbfType;//位图文件的类型,必须为BM(1-2字节)
DWORDbfSize;//位图文件的大小,以字节为单位(3-6字节,低位在前)
WORDbfReserved1;//位图文件保留字,必须为0(7-8字节)
WORDbfReserved2;//位图文件保留字,必须为0(9-10字节)
DWORDbfOffBits;//位图数据的起始位置,以相对于位图(11-14字节,低位在前)
//文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;


// BMP位信息头
typedefstructtagBITMAPINFOHEADER{
DWORDbiSize;//本结构所占用字节数(15-18字节)
LONGbiWidth;//位图的宽度,以像素为单位(19-22字节)
LONGbiHeight;//位图的高度,以像素为单位(23-26字节)
WORDbiPlanes;//目标设备的级别,必须为1(27-28字节)
WORDbiBitCount;//每个像素所需的位数,必须是1(双色),(29-30字节)
//4(16色),8(256色)16(高彩色)或24(真彩色)之一
DWORDbiCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)
//1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORDbiSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)
LONGbiXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)
LONGbiYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)
DWORDbiClrUsed;//位图实际使用的颜色表中的颜色数(47-50字节)
DWORDbiClrImportant;//位图显示过程中重要的颜色数(51-54字节)
}BITMAPINFOHEADER;
参考:http://baike.baidu.com/subview/7671/8245150.htm?fr=aladdin 你把两个头信息加上颜色索引表剩余的就是位图像素数据,通过读写文件,提取信息,然后取得像素数据! 1.如果位图不使用颜色索引,则用像素数据使用 3 byte 存储一个像素点RGB,根据你的算法求出指定矩形在该数据集合中的 索引然后直接用你指定颜色值替代(RGB值,如白色 255,255,255)! 2.如果使用颜色索引表,则增加或者查找颜色索引表是否有你指定颜色值,如果没有则增加一个索引,然后根据你的算法可知需要替换的数据的位置,修改索引指向! 把你的文件头,位信息头,颜色索引表(有可能增加一个索引,记得修改位信息头),像素数据等安装顺序写入到新文件,完毕!
JiangWenjie2014 2014-10-21
  • 打赏
  • 举报
回复
百度一下位图文件的格式不就行了?肯定有位图的长宽,还有每个点使用了几个字节。
unituniverse2 2014-10-21
  • 打赏
  • 举报
回复
24位色的时候: addr 为 bmpdata_ptr + y * bin_w + x*3 bin_w为位图的字节宽度: bin_w = (Width * 3 + (4U - 1U)) & ~(4U - 1U)
tab0tab 2014-10-21
  • 打赏
  • 举报
回复
(宽度*3)% 4 != 0
tab0tab 2014-10-21
  • 打赏
  • 举报
回复
1、根据图像的宽度不同,注意计算每一行的字节数,如果(宽度*3)% != 0,就要补上几位。 2、图像数据是从左下开始的,不是从左上开始的。按B G R排列。 注意上两点,就可以算出具体的数据点的位置,然后修改数据就可以了。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧