文档章节

BMP图像四字节对齐的问题

卓尔
 卓尔
发布于 2013/03/01 18:37
字数 402
阅读 1.8K
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

 1、内存分配单位是32位的,即4字节; 
  2、位图中每行象素的数据是连续的,而下一行不能和上一行共一个分配单元(4字节),所以每行象素的数据长度必须是4字节的倍数; 
  3、代码说明如下: 
        
  int     WidthBytes(   int   nBits,   int   nWidth   ) 
  {//nBits为色彩位数,   nWidth为每行象素个数 
  int   nWidthBytes;//每行象素的数据长度 

  nWidthBytes   =   nWidth; 
  if(   nBits   ==   1   )   nWidthBytes   =   (   nWidth   +   7   )   /   8; 
  else   if(   nBits   ==   4   )   nWidthBytes   =   (   nWidth   +   1   )   /   2;      /*竟然没有8位的。256色不是很常见吗?!*/
  else   if(   nBits   ==   16   )   nWidthBytes   =   nWidth   *   2; 
  else   if(   nBits   ==   24   )   nWidthBytes   =   nWidth   *   3;//24位真彩色 
  else   if(   nBits   ==   32   )   nWidthBytes   =   nWidth   *   4;//32位真彩色 
  
  //*******四字节对齐******* 
  while(   (   nWidthBytes   &   3   )   !=   0   )   nWidthBytes++; 
  //*******四字节对齐******* 
  return(   nWidthBytes   ); 

  }  

--------------------------------------------------------------------------------------------------------------------------

我的理解:

1.bmp为4字节的方式,因此在buf中,不论存取还是显示,都是以4字节为单位的。

2.接下来的问题就是怎么确定一行到底要怎么对齐。

首先,int 的除法。结果还是int,会舍掉小数点。所以。我们加上3字节。再除以4。就可以防止字节数变少

eg:Width=1(位图的宽度为1像素) BitCount=24(24位的像素位数。1个像素24位即3字节)

       Width*BitCount/8=3得出占用的字节数是3.

       (3+3)/4  这是求出“基数”,为1.  如果没有加上3的话,商为0,明显不符合题意。

         1*4得出LineBytes=4.

同理,如果是以位为单位,就是加上31.   Width*BitCount+31

  then: (Width*BitCount+31)/32  *4

上一篇: BMP图像小细节
下一篇: yuv和yCbCr的差异
卓尔

卓尔

粉丝 23
博文 284
码字总数 130860
作品 1
杭州
私信 提问
加载中
请先登录后再评论。
【opencv】图形的绘制

1.矩形图像的绘制: 原函数:void cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8,int shift=0) img就是需要绘制的图像 pt1 and pt......

其实我是兔子
2014/10/08
1.2K
1
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.4K
16
Web开发组件管理器--Bower

Bower 是一个针对Web开发的包管理器。该工具主要用来帮助用户轻松安装CSS、JavaScript、图像等相关包,并管理这些包之间的依赖。 功能有些类似于Component。不同之处是,Component是围绕Git...

匿名
2013/02/01
1.2W
2
跨平台 3D 游戏引擎--Castle Game Engine

Castle Game Engine 是一个用 Object Pascal 开发的跨平台 3D 游戏引擎。包含一个灵活的 3D 对象系统与开箱即用的水平,项目,智能生物等等。使用 X3D、VRML、Collada 和其他格式实现渲染和处理...

匿名
2013/02/05
2K
0
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

没有指定分支的“git push”的默认行为 - Default behavior of “git push” without a branch specified

问题: I use the following command to push to my remote branch: 我使用以下命令推送到我的远程分支: git push origin sandbox If I say 如果我说 git push origin does that push ch......

技术盛宴
58分钟前
21
0
为什么在允许某些Unicode字符的注释中执行Java代码?

问题: The following code produces the output "Hello World!" 以下代码生成输出“Hello World!” (no really, try it). (不,真的,试试吧)。 public static void main(String... args......

富含淀粉
今天
18
0
字符串格式:%与.format - String formatting: % vs. .format

问题: Python 2.6 introduced the str.format() method with a slightly different syntax from the existing % operator. Python 2.6引入了str.format()方法,其语法与现有的%运算符略有不......

javail
今天
22
0
什么是按位移位(位移)运算符以及它们如何工作? - What are bitwise shift (bit-shift) operators and how do they work?

问题: I've been attempting to learn C in my spare time, and other languages (C#, Java, etc.) have the same concept (and often the same operators) ... 我一直在尝试在业余时间学习......

法国红酒甜
今天
32
0
OSChina 周二乱弹 —— 卧槽 李荣浩的契约兽啊

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《红色的回忆》- 痛仰乐队 手机党少年们想听歌,请使劲儿戳(这里) 动弹, 又好多...

小小编辑
今天
81
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部