24位位图解析

合集下载

位图和调色板

位图和调色板

第1章Windows位图和调色板1.1 位图和调色板的概念如今Windows(3.x以及95,98,NT)系列已经成为绝大多数用户使用的操作系统,它比DOS 成功的一个重要因素是它可视化的漂亮界面。

那么Windows是如何显示图象的呢?这就要谈到位图(bitmap)。

我们知道,普通的显示器屏幕是由许许多多点构成的,我们称之为象素。

显示时采用扫描的方法:电子枪每次从左到右扫描一行,为每个象素着色,然后从上到下这样扫描若干行,就扫过了一屏。

为了防止闪烁,每秒要重复上述过程几十次。

例如我们常说的屏幕分辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复扫描屏幕70次。

我们称这种显示器为位映象设备。

所谓位映象,就是指一个二维的象素矩阵,而位图就是采用位映象方法显示和存储的图象。

举个例子,图1.1是一幅普通的黑白位图,图1.2是被放大后的图,图中每个方格代表了一个象素。

我们可以看到:整个骷髅就是由这样一些黑点和白点组成的。

图1.1 骷髅图1.2 放大后的骷髅位图那么,彩色图是怎么回事呢?我们先来说说三元色RGB概念。

我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)组合而成。

有的颜色含有红色成分多一些,如深红;有的含有红色成分少一些,如浅红。

针对含有红色成分的多少,可以分成0到255共256个等级,0级表示不含红色成分;255级表示含有100%的红色成分。

同样,绿色和蓝色也被分成256级。

这种分级概念称为量化。

这样,根据红、绿、蓝各种不同的组合我们就能表示出256×256×256,约1600万种颜色。

这么多颜色对于我们人眼来说已经足够丰富了。

表1.1 常见颜色的RGB组合值颜色R G B红255 0 0蓝0 255 0绿0 0 255黄255 255 0紫255 0 255青0 255 255白255 255 255黑0 0 0灰128 128 128你大概已经明白了,当一幅图中每个象素赋予不同的RGB值时,能呈现出五彩缤纷的颜色了,这样就形成了彩色图。

1 怎样读取BMP文件中的像素数据与显示位图

1  怎样读取BMP文件中的像素数据与显示位图

怎样读取BMP位图的数据与显示位图计算机与信息工程系管庶安一 BMP位图文件的结构以24位BMP位图文件为例说明。

BMP位图文件结构如下表所示:位图数据◇逐行逐列记录各像素点的三基色分量。

◇每一像素点占用三个字节,分别表示蓝色分量B、绿色分量G、红色分量R的值。

◇ 设图像有n行、m列像素,行顺序为从下向上分别为第1行、第2行……;列顺序为从左向右分别为第1列、第2列……。

按此顺序将各像素的三基色值记录于BYTE型的一维数组中,如下图所示:注意:当一行占用的字节数不是4的整数倍时,应补充1~3个无效字节,使一行占用的字节数能被4整除。

无效字节可为任意值,不会影响图像内容。

二读取BMP位图数据(1)在MFC工程中的 .H文件中定义如下全局成员变量:BITMAPFILEHEADER FileHead; // 定义存放 .BMP 文件头的结构BITMAPINFOHEADER BmpInfo; // 定义存放 .BMP 信息头的结构LPBYTE lpImage; // 定义存放 .BMP文件中的位图数据的BYTE型指针typedef struct CCC{ // 定义能存放一个像素的3个基色值的结构类型BYTE B;BYTE G;BYTE R;};CCC C3 [480] [640];// 定义能存放一幅480行、640列像素的二维数组,以便图像处理与识别时运算(2)在.CPP文件中的类构造函数中,为lpImage指针申请内存:lpImage=(LPBYTE)new BYTE[640*480*3];在.CPP文件中的类析构函数中,为lpImage指针释放内存:delete[ ] lpImage;(3)在.CPP文件中的适当函数中打开.BMP文件,读取信息头和位图数据。

CFile f;BOOL OK;OK=f.Open( Bmp.PathName,CFile::modeRead|CFile::typeBinary|CFile::shareExcl usive,NULL);if(!OK) return(-1); //不能打开文件,返回失败标志-1f.Read(&FileHead,sizeof(FileHead)); //读文件头if(FileHead.bfType!=0x4d42) {f.Close();return -2; //不是BMP文件,返回失败标志-2 }short x,y,z;z=(BmpInfo.biWidth*3/4)*4+(BmpInfo.biWidth*3%4==0 ? 0 : 4);f.Read(&BmpInfo,sizeof(BmpInfo)); //读信息头f.Seek(FileHead.bfOffBits,0);f.Read(lpImage,BmpInfo.biHeight*z); //读全部位图数据f.Close();for(y=BmpInfo.biHeight-1;y>=0;y--){memcpy(C3[y],lpImage+(BmpInfo.biHeight-1-y)*z,z); //逐行将位图数据填写到C3数组中}return 1; //最后,返回成功标志1三显示位图1 先按上述方法读取位图数据,再将读取数据予以显示。

BMP格式介绍(一)

BMP格式介绍(一)

BMP格式介绍(⼀)原理篇:⼀、编码的意义。

让我们从⼀个简单的问题开始,-2&-255(中间的操作符表⽰and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的⼈并不多。

这个看起来和图⽚格式没有关系的问题恰恰是图⽚格式的核⼼内容以⾄于整个计算机系统的核⼼内容,多媒体技术虽然没有数据结构,操作系统等计算机基础课所占的地位重,但是在于研究编码⽅⾯有着⾮常重要的地位。

图像其实可以看做⼀种特殊编码过的⽂件。

⼆、从简单的24位bmp开始bmp是最常见也是编码⽅式最简单的图⽚格式,这⾥不说明⼀幅图⽚是怎么显⽰在电脑上的,那不是多媒体技术研究的问题,我们来研究bmp的格式问题,为了使各位能够最快的了解bmp格式,我们从24位的⼀个16*16的⼩图像开始。

我们使⽤常⽤的绘图软件创建⼀个16*16的24位bmp图像,如下图所⽰:可以看到图⽚很⼩,我们使⽤ultra-edit看看其内部是什么(ultra-edit是⼀个⽐记事本更加⾼级的编辑软件,可以在⽹上下载到),我们打开其内部看到的是如下的⼀个⼗六进制的数据⽂件:看起来很⾼深⽽⼜很凌乱的样⼦,我们慢慢地说明这些看起来很凌乱的数据流都代表了什么意思,⾸先我们要说明的是,这⾥⾯⼀个数字代表的是⼀个字节,⽐如头两个数42 4d是两个⼗六进制的数,代表了两个字节。

可以看到在UE中⼀⾏是⼗六个字节。

在具体说明每个字节的含义之前,⾸先需要说明的是字节的排布⽅式,在操作系统和计算机组成结构⾥⾯有⼤端法和⼩端法(如果有遗忘可以查⼀下书),简易的说法是这样的,⼩端法的意思是“低地址村存放低位数据,⾼地址存放⾼位数据”,⼤端法就是反过来的,举个例⼦,如果地址从左到右依次增⼤,那么数据01 02的⼩端法存储⽅式是02 01,⼤端法的存储⽅式就是01 02。

在所有的intel的机器上都是采⽤的⼩端法,⽽⼤端法主要存在于摩托罗拉造的处理器的机器上,所以如果你⽤的是⼀个果粉,⽤的是MAC的话,那么你看到的数据排布⽅式是和我们说明中是相反的。

位图结构解析

位图结构解析

位图结构解析位图结构解析2011-03-19 00:55 99人阅读评论(0) 收藏举报BMP是一种与硬件设备无关的图像文件格式,使用非常广。

它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。

BMP文件的图像深度可选lbit、4bit、8bit及24bit。

BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。

由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

组成典型的BMP图像文件由四部分组成:1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

类型位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。

DDB位图在早期的Windows系统(Windows3.0以前)中是很普遍的,事实上它也是唯一的。

然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB位图的一些固有的问题开始浮现出来了。

比如,它不能够存储(或者说获取)创建这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示设备是否适合显示这张图片。

为了解决这一难题,微软创建了DIB位图格式。

设备无关位图(Device-IndependentBitmap)DIB位图包含下列的颜色和尺寸信息:*原始设备(即创建图片的设备)的颜色格式。

*原始设备的分辨率。

*原始设备的调色板*一个位数组,由红、绿、蓝(RGB)三个值代表一个像素。

*一个数组压缩标志,用于表明数据的压缩方案(如果需要的话)。

位图是什么意思

位图是什么意思

位图(bitmap),亦称为点阵或栅格,是由称作像素(图片元素)的单个点组成的。

这些点可以进行不同的排列和染色以构成图样。

当放大位图时,可以看见赖以构成整个的无数单个方块。

扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。

然而,如果从稍远的位置观看它,位图的颜色和形状又显得是连续的。

用数码相机拍摄的照片、扫描仪扫描的图片以及计算机截屏图等都属于位图。

位图的特点是可以表现色彩的变化和颜色的细微过渡,产生逼真的效果,缺点是在保存时需要记录每一个像素的位置和颜色值,占用较大的存储空间。

常用的位图处理软件有Photoshop(同时也包含矢量功能)、Painter和Windows 系统自带的画图工具等,Adobe Illustrator则是矢量图软件。

中文名位图外文名bitmap反义词矢量图应用计算机、电子工程相关名词位图文件简介亦称为点阵或栅格,是由称作像素(图片元素)的单个点组成的。

这些点可以进行不同的排列和染色以构成图样。

当放大位图时,可以看见赖以构成整个的无数单个方块。

扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。

然而,如果从稍远的位置观看它,位图的颜色和形状又显得是连续的。

由于每一个像素都是单独染色的,您可以通过以每次一个像素的频率操作选择区域而产生近似相片的逼真效果,诸如加深阴影和加重颜色。

缩小位图尺寸也会使原图变形,因为此举是通过减小像素来使整个变小的。

同样,由于位图是以排列的像素集合体形式创建的,所以不能单独操作(如移动)局部位图。

[1]处理位图时,输出的质量决定于处理过程开始时设置的分辨率高低。

分辨率是一个笼统的术语,它指一个文件中包含的细节和信息的大小,以及输入、输出、或显示设备能够产生的细节程度。

操作位图时,分辨率既会影响最后输出的质量也会影响文件的大小。

处理位图需要三思而后行,因为给选择的分辨率通常在整个过程中都伴随着文件。

无论是在一个300dpi的打印机还是在一个2570dpi的照排设备上印操作(如移动)局部位图。

AD转换电路设计之24位、250 kSPS单电源数据采集系统

AD转换电路设计之24位、250 kSPS单电源数据采集系统

图3. 有效分辨率(均方根位数)与输出数据速率的关系
先将均方根噪声转换为峰峰值噪声近似值(均方根噪声乘以 系数6.6),有效分辨率便可转换为无噪声代码分辨率。计算 结果约为2.7位,随后将其从有效分辨率中扣除,以得到无 噪声代码分辨率。如本例所示,经计算后,19.3位有效分辨 率相当于16.6位无噪声代码分辨率。这一结果与AD7176-2 在无缓冲短路输入情况下,输出数据速率为250 kSPS时的17.2 位无噪声位规格相比,大约有0.3位的差异。这是由于本例 仅采用±10 V作为满量程范围,而非±12.5 V的最大值。
24位、250 kSPS单电源数据采集系统
评估和设计支持
电路评估板 AD7176-2电路评估板(EVAL-AD7176-2SDZ) 系统演示平台(EVAL-SDP-CB1Z) 设计和集成文件 原理图、布局文件、物料清单
电源系统,针对工业电平信号采样进行优化,集成一个24 位、250 kSPS Σ-Δ型ADC。两个差分通道或四个伪差分通道 中的每一个都能够以17.2位无噪声代码分辨率、最高50 kSPS 的速率对其进行扫描。 本电路利用创新型差分放大器和内置激光调整电阻执行衰 减和电平转换,通过具有低电源电压的精密ADC可以解决 获取±5 V、±10 V和0 V至10 V的标准工业电平信号并进行数 字化处理的问题。本电路的应用包括过程控制(PLC/DCS模 块)、医疗以及科学多通道仪器和色谱仪。
电路笔记 CN-0310
连接/参考器件 Circuits from the Lab® reference designs are engineered and tested for quick and easy system integration to help solve today’s analog, mixed-signal, and RF design challenges. For more information and/or support, visit /CN0310. AD7176-2 AD8475 ADR445 24位、250 kSPS Σ-Δ型ADC, 建立时间20 μs 精密、可选增益、全差分漏斗放大器 5 V超低噪声LDO XFET®基准电压源

BMP位图格式详解一

BMP位图格式详解一

BMP位图格式详解一位图格式BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。

它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。

在系统中以BMP为扩展名保存。

打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。

现在讲解BMP的4个组成部分:1.文件头信息块0000-0001 :文件标识,为字母ASCII码“BM”。

0002-0005 :文件大小。

0006-0009 :保留,每字节以“00”填写。

000A-000D :记录图像数据区的起始位置。

各字节的信息含义依次为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。

2.图像描述信息块000E-0011:图像描述信息块的大小,常为28H。

0012-0015:图像宽度。

0016-0019:图像高度。

001A-001B:图像的plane总数(恒为1)。

001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。

001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。

0022-0025:图像区数据的大小。

0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。

002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。

002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。

3.颜色表颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。

其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。

即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。

bmp文件格式解析

bmp文件格式解析

BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。

由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW 数据的重要来源。

Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。

下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:Øbmp文件头(bmp file header):提供文件的格式、大小等信息Ø位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息Ø调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表Ø位图数据(bitmap data):就是图像数据啦^_^下面结合Windows结构体的定义,通过一个表来分析这四个部分。

我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit 来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。

因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。

这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。

下面针对一幅特定的图像进行分析,来看看在位图文件中这四个数据段的排布以及组成。

我们使用的图像显示如下:这是一幅16位的位图文件,因此它是含有调色板的。

在拉出图像数据进行分析之前,我们首先进行几个约定:1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。

bmp翻转旋转放大缩小

bmp翻转旋转放大缩小

bmp文件由三部分组成:文件头,位图信息头,RGB像素数据。

拿24位bmp图片举例,读取文件fread就可以,开始读取sizeof(BITMAPFILEHEADER)长的数据,再读取sizeof(BITMAPINFOHEADER)长的数据,里面有位图的原始高度和宽,然后读取(3*原始宽度*原始高度)长的原始RGB数据到内存,这样对那块数据操作,就能实现旋转,翻转,放大缩小操作了,关键是写出原始宽度、原始高度、原始RGB数据和变换后的宽度、高度、RGB数据的关系,对于24位的图片一个像素占3个字节,举例如下90度旋转:原始RGB数据块5*3 旋转90度旋转RGB数据块3*51 2 3 4 5 11 6 16 7 8 9 10 12 7 211 12 13 14 15 13 8 314 9 415 10 5原始数据在pBuf中旋转后的数据pNewBufpBuf转到pNewBuf中for(int i=0;i<3;i++) //3原始高度{for(int j=0;j<5;j++) //5原始宽度{for(int K = 0;K<3;K++) //每个像素占三个字节{*(pNewBuf + j*5*3+(3 - i- 1)*3+k) = *(pBuf + i*3*5 + j*3 +K) ; //关键是这个算法}}}保存旋转后的图片注意高和宽交换了。

原始RGB数据块5*3 翻转180 旋转RGB数据块 5*31 2 3 4 5 11 12 13 14 156 7 8 9 10 6 7 8 9 1011 12 13 14 15 1 2 3 4 5pBuf转到pNewBuf中for(int i=0;i<3;i++) //3原始高度{for(int j=0;j<5;j++) //5原始宽度{for(int K = 0;K<3;K++) //每个像素占三个字节{*(pNewBuf +(3-i-1)*3*5 + j*3 +K ) = *(pBuf + i*3*5 + j*3 + K) ; //关键是这个算法}}}对于放大和缩小也是对数据块的转换下篇继续!。

位图文件(BMP)格式分析以及程序实现

位图文件(BMP)格式分析以及程序实现

inf.read((char*)&header, sizeof(header));if(header.bfType != 0x4D42)return false;这个很简单,没有什么好说的。

2、加载位图信息头//Load the image information headerBITMAPINFOHEADER infoheader;memset(&infoheader, 0, sizeof(infoheader));inf.read((char*)&infoheader, sizeof(infoheader));m_iImageWidth = infoheader.biWidth;m_iImageHeight = infoheader.biHeight;m_iBitsPerPixel = infoheader.biBitCount;这里我们得到了3各重要的图形属性:宽,高,以及每个像素颜色所占用的位数。

3、行对齐由于Windows在进行行扫描的时候最小的单位为4个字节,所以当图片宽X 每个像素的字节数!= 4的整数倍时要在每行的后面补上缺少的字节,以0填充(一般来说当图像宽度为2的幂时不需要对齐)。

位图文件里的数据在写入的时候已经进行了行对齐,也就是说加载的时候不需要再做行对齐。

但是这样一来图片数据的长度就不是:宽X 高X 每个像素的字节数了,我们需要通过下面的方法计算正确的数据长度://Calculate the image data sizeint iLineByteCnt = (((m_iImageWidth*m_iBitsPerPixel) + 31) >> 5) << 2;m_iImageDataSize = iLineByteCnt * m_iImageHeight;4、加载图片数据对于24位和32位的位图文件,位图数据的偏移量为sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER),也就是说现在我们可以直接读取图像数据了。

32位真彩色与24位真彩色区别【转】

32位真彩色与24位真彩色区别【转】

32位真彩⾊与24位真彩⾊区别【转】真彩⾊是指图像中的每个像素值都分成R、G、B三个,每个基⾊分量直接决定其基⾊的强度,这样产⽣的⾊彩称为真彩⾊。

真彩⾊图像是⼀种⽤三个或更多字节描述像素的计算机图像存储⽅式。

真彩⾊-表⽰⽅法计算机表⽰颜⾊也是⽤。

16位⾊的发⾊总数是65536⾊,也就是2的16次⽅;24位⾊被称为真彩⾊,它可以达到⼈眼分辨的极限,是1677万多⾊,也就是2的24次⽅。

但32位⾊就并⾮是2的32次⽅的发⾊数,它其实也是1677万多⾊,不过它增加了256阶颜⾊的灰度,为了⽅便称呼,就规定它为32位⾊。

少量显卡能达到36位⾊,它是24位发⾊数再加512阶颜⾊灰度。

⾄于32位⾊和16位⾊⾁眼分辨不出来?其实如果你⽤两台品牌型号都⼀样的显⽰器,分辨调不同的⾊,就能看出区别,⽽只是⼀台机的反复转换就⽐较难分辨出来。

如果你⽤的是WINDOWS XP,在WINDOWS启动时有个“欢迎使⽤”字样的界⾯,那⾥的兰⾊颜⾊过渡就很容易看出区别,16位⾊的颜⾊过渡很容易看出被分层了不⾃然;⽽⽤32位⾊就相当柔和,过渡很⾃然真彩⾊-图像存储真彩⾊(麦⾦塔电脑⽤户则为百万⾊)图像是⼀种⽤三个或更多字节描述像素的计算机图像存储⽅式。

⼀般来说,前三个通道都会各⽤⼀个字节表⽰,如红绿蓝(RGB)或者蓝绿红(BGR)。

如果存在第四个字节,则表⽰该图像采⽤了。

然⽽,实际系统往往⽤多于8位(即1字节)表达⼀个通道,如⼀个48位的扫描仪等。

这样的系统都统称为真彩⾊系统。

每⼀⾊光以8位元表⽰,每个通道各有256(28)种阶调,三⾊光交互增减,RGB三⾊光能在⼀个像素上最⾼显⽰24位1677万⾊(256*256*256=16,777,216),这个数值就是电脑所能表⽰的最⾼⾊彩。

普遍认为⼈眼对⾊彩的分辨能⼒⼤致是⼀千万⾊,因此由RGB形成的图像均称做真彩⾊。

真彩⾊-显⽰模式尽管⼀个阿尔法通道只是⼀个透明通道,从图像⾓度来说意义不⼤,然⽽这种32位的图像却在桌⾯时代⼤⾏其道。

1.2编码的的基本方式

1.2编码的的基本方式
文件的大小=文件头+信息头+颜色表项+图像分辨率×图像量化位数÷8
4文件头:包含文件的类
型、大小和位图起始位置 等信息,共14个字节。
3位图信息头:用于说明
位图的尺寸等信息,共40 个字节。
颜色表项:用于说明位图中的颜
1色,有若干个表项,每一个表项定
义一种颜色。当图像量化位数为1、 4、8时,分别2、16、256种颜 色,每个颜色表项占4个字节;当
A:01000001(十进制数65) ,a:01100001(十进制数97),
0:0110000(十进制数48)见P10表
一、文字编码
2、国标码
由于ASCII码只包含英文、数字和一些控制符号,并不能表示汉字,因此我国 设计了用于处理汉字的简体中文的GB码和用于繁体中文的BIG5码(大五码)。
例如:GB2312主要分为两部分,编号127之前的符号跟ASCII码表示的意义 相同,属于单字节码;127之后的符号统一用两个字节表示,包含了几乎所有的 简体中文字(中文编码高字节的最高位不为0)
第一章 数据与信息
1.2.2 编码的基本方式
在现代技术的信号处理中,数据基本上是通过编码将模拟信号转换为 数字信号进行存储和传输,文字、图像、声音等类型的数据都可经过编码 进行存储和传输。
文字编码 图像编码 声音编码
一、文字编码
文字编码是效率相对较低的编码方式。
单字节码
ASCII码 莫尔斯码
文字编码
图像量化位数为24时,没有颜色表
项。
图形数据:记录像素值,
图像分辨率×图像量化位数 ÷8
图像分辨率=图像x方向的像素数×图像y方向的像素数。
图像量化位数,也叫图像深度,是指图像中每个像素点记录颜色所用二进制的位数。

三分钟解析24位真彩BMP格式文件 - 推酷

三分钟解析24位真彩BMP格式文件 - 推酷
我来评几句
请 输 入 评 论 内 容 ...
已发表评论数(0)
搜索文章
/articles/FvaIVj
登录后评论
4/7
15-4-9
相关站点
ITeye-博客
+ 订阅
相关主题
技术
三分钟解析24位真彩BMP格式文件 - 推酷
热门文章
1. 栈溢出的利用
2. 记一次tcmalloc分配内存引起的coredump
3. RapidJSON —— C++ 快速 JSON 解析器和生成器
4. C++学习之引用
/articles/FvaIVj
5/7
15-4-9
三分钟解析24位真彩BMP格式文件 - 推酷
5. 在 Visual Studio 本地引用 Boost 6. Exploiting CVE-2015-0311, Part II: Bypassing Control Flow Guard on Window..
/articles/FvaIVj
7/7
/articles/FvaIVj
1/7
15-4-9
三分钟解析24位真彩BMP格式文件 - 推酷
000000XX0h 是用来方面看数据的(也可以方便记数),比如数据表的第一行的第三个字节数 据 9E 的位置就是 00000000h + 2 = 00000002h ,这就是为什么在一些解释中定位中使用 000000XXXh 的原因。
因此在我们的读取数据中需要根据 BMP 图像的宽度来判断是否被补 0 ,判断方法就是先 判断一行的字节数是否可以被 4 整除,如果整除则不需要补 0 ,如果没有整除,则求出补的 0 的个数(具体计算方法是, bu_0_number = width( 像素 ) * 3 % 4 ),那么就知道在每 一行的末尾都补了 bu_0_number 个 0 ,因此我们在读取时绘制图片时就要忽略这些数据。 (补充:求每一行的字节数 size = width * 3 )

24位真彩色位图(bmp)读取代码

24位真彩色位图(bmp)读取代码

BITMAPINFO * pBmpInfo;BYTE * pBmpData;BITMAPFILEHEADER bmpHeader;BITMAPINFOHEADER bmpInfo;CFile bmpFile;CString strFileName;CString strFilter = "位图文件(*.bmp)|*.bmp|所有文件(*.*)|*.*|";CFileDialog dlg(TRUE,NULL,NULL,NULL,strFilter,this);if (!dlg.DoModal() == IDOK) return;strFileName = dlg.GetPathName();/// 通过读取位图文件显示位图if(!bmpFile.Open(strFileName,CFile::modeRead|CFile::typeBinary)) return;if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER)) {AfxMessageBox("read bmp header failed!");return;}if (bmpHeader.bfType != 0x4d42){AfxMessageBox("invalid file type!");return;}if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER)) {AfxMessageBox("read bmp infor header failed!");return;}if (bmpInfo.biBitCount != 24){AfxMessageBox("File is not 24 bit.Application doesn't support this kind of file!");return;}pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];if (!pBmpInfo){AfxMessageBox("memory error!");return;}memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;pBmpData = (BYTE*)new char[dataBytes];if (!pBmpData){AfxMessageBox("memory error!");delete pBmpData;return;}if (bmpFile.Read(pBmpData,dataBytes) != dataBytes){AfxMessageBox("Read bmp data failed!");delete pBmpInfo;delete pBmpData;return;}bmpFile.Close();CClientDC *pDC = new CClientDC(this);pDC->SetStretchBltMode(COLORONCOLOR);StretchDIBits(pDC->GetSafeHdc(),0,0,bmpInfo.biWidth,bmpInfo.biHeight,0,0,bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,p BmpInfo,DIB_RGB_COLORS,SRCCOPY);。

瞒天过海—谈24位位图加密

瞒天过海—谈24位位图加密
+ ) 是 4的 倍 数 , 那 么 用 零 补 齐 。 3不 从 刚 才的 介绍 中我 们 知道 ,像 素 中的 红色 部分 R 一 共 有 2 6种 , 实 际 上 人 眼 根 本 无 法 区 分 2 6种 5 5 红 , 例 如 R =l 8和 R=l 7 人 眼 难 以辨 别 , 也 就 2 , 2
上 面 , 孔 中露 出来 的字 就 组 成 了秘 密 信息 。随 着 电
脑 产 生 了。 这里
点 , 其 他 像 素 按 照 从 左 到 右 、从 下 到 上 的 规 则 排 列 。值 得 注 意 的 是 :如 果 每 行所 占字 节数 ( 素 数 像
存 储 , 低 位 在 前 , 高 位 在 后 , 例 如 0 f ,x lO O x 4O O ,xO ,
o 0表示 5 , 经 常 修 改游 戏 的 朋 友 应该 不 陌生 x0 00 吧) ;第 ll l 、 2、 l 3、l 4字 节 为 像 素 信 息相 对 于 文 件头 的偏 移 量 ,这 个 数一 般 为 5 4,也就 是说 从 第

是说 , 用 8 t表示 红 ,最 后 一个 b t 对 人眼 的 区 bi i值 分 没有 效 果 , 无 足 轻 重 。对 于 绿 色 蓝 色 也 是 如 此 , 这 样 每个像 素 就有 3个 bt 冗余 的 ,我们 可 以把它 i是
解 放 出 来 , 存 放 有 用 的 信 息 一一 加 密 信息 。
J2 ● ● lD F6 27 0 9 00 90 00 00 90 F4 01 00 00 90 01 00 口D C0 27 D9 0口 C4 ■ E 00 09 36 00 00 90 Q1 90 D口 90 C4
/ /首 先 打 开 图 片 文 件 f e ( .0S E S T) s k f 1 ,E K— E ; e p

24位位图格式解析-电脑资料

24位位图格式解析-电脑资料
代码
1 BITMAPFILEHEADER * pbmfh ;
2 BITMAPINFO * pbmi ;
3 BYTE * pBits ;
4 pbmfh = DibLoadImage (szFileName) ;
5 pbmi = (BITMAPINFO *) (pbmfh + 1) ;
6 pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ;
7 for( i=0; i < 1024; i++)
8 {
9 pPrintBlock[i] = (char*)malloc(216);
10 memset(pPrintBlock[i], 0, 216);
11 }
12
13 for(h = 0; h < pbmi->bmiHeader.biHeight; h++)
14 {
15 for(w = 0; w < pbmi->bmiHeader.biWidth; w++)
16 {
17 b1 = *pBits; //B
18 b2 = *(pBits+1); //G
19 b3 = *(pBits+2); //R
20 if( (int)b1 != 255amp;& (int)b3 != 255)
26 }
27 pBits += 3;
28
29 }
30 if(pbmi->bmiHeader.biWidth *3 % 4 != 0)
31 {
32 pBits += ( 4 - pbmi->bmiHeader.biWidth*3 % 4);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我所要介绍的是24位真彩色位图文件的结构。

一个24位真彩色位图文件包括以下三个部分:位图文件头、位图信息头和颜色数据域,这都是我自己起的名字,不知是否与经典有出入,大家应该能够意会。

首先说说位图文件头。

就目前来看我所见到过的位图文件头都位于位图文件的最前部,长都是14个字节,例如有这样一个位图文件(用16位编辑器打开浏览时的效果):
那么在第0行从左向右的前14个字节(红色部分)属于位图文件头,各个字节的意义是这样的:
42 4D:看作ASCII码,对应的字母为‘BM’,即表示该文件是位图文件;
86 00 00 00:四个字节用于表示改为图文件的大小尺寸,要注意的是它们是按低位到高位排列的,那么可以看出整个位图文件的尺寸是0x00000086字节,即134字节。

不难得知,这四个字节最大可以表示4,294,967,296,即可以表示4GB的位图大小;
00 00 00 00:查资料知道,这4个字节是保留位,用于存储文件大小的数据。

而我没有找到超过4G的位图,因此不知道这四个自己究竟如何使用。

不过可以推测可能是用跟前面4字节共64 bit来表示文件的大小。

FAT32文件系统下不支持超过4GB的文件,NTFS系统支持;
36 00 00 00:也是按从低位到高位排列的,用于表示改位图颜色数据域相对文件开始处的偏移量,可以看到这个位图的颜色数据域是从0x00000036字节处开始的(这里有点想不通,既然前面要用8个字节表示文件大小,为什么这里的偏移量只有4字节?)。

以上就是位图文件头的情况,接下来是位图信息头,仍旧观察前面的位图,从第一行E序字节的28开始(蓝色部分)共40字节,各个字节的含义是:
28 00 00 00:表示信息头的长度,0x00000028=40,即位图信息头占40个字节;
05 00 00 00:表示位图宽度,单位为像素。

即位图的宽度为5个像素;
05 00 00 00:表示位图高度,单位为像素。

即位图的高度为5个像素;
01 00:表示位图设备级别;
18 00:位图级别,0x0018=24,即24位真彩色;
00 00 00 00:表示压缩类型,为零表示不压缩;
50 00 00 00:用于表示颜色数据区的实际长度,16进制,单位为字节,这里是80字节;
00 00 00 00:表示水平分辨率,具体什么意思还不清楚;
00 00 00 00:表示垂直分辨率;
C4 0E 00 00:表示位图实际使用的颜色表中的颜色变址数。

C4 0E 00 00:表示位图显示过程中被认为重要颜色变址数。

最后是颜色数据域。

有一点要说明,颜色数据区中每一行的数据长度必须是4的整数倍,为了做到这一点,颜色数据区每一行都可能需要进行补齐。

例如上述图片宽5像素,高5像素,而每个像素占3个字节,这样似乎颜色数据区应该为5*5*3=75字节,但是文件信息头中记录的却是80字节,实际上多出的5个字节被分到了每一行用于补齐。

还有一个尝试要提醒大家:位图颜色数据域是从位图的最后一行的最左端开始记录颜色信息的,而不是通常认为的位图第一行最左端。

此外,色光三原色的记录顺序在文件中是蓝、绿、红。

总的来说,观察上面的文件情况,可以看出文件的第一行为黑色,行末补了一个全零字节,第二行为白色,第三行为红色,第四行为绿色,第五行为蓝色,每一行的末尾都用一个全零字节补齐(不知道是否一定要补全零字节,我尝试胡乱修改补齐字节之后并未发现影响图片显示的情况)。

相关文档
最新文档