在图像处理,图形学、计算机视觉中,我们经常能够见到bmp这种格式的图片;那么对于我们来说想要处理这种图片,首先就应当了解这种图片,知己知彼方能百战不殆。
那么首先我们来了解一下bmp格式的图片:
一、了解BMP
(一)概述
BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
(二)格式特性
了解完BMP的通用性之后,其实我们想要处理BMP格式图片,最关心的还是这个格式的组成是怎样的,有什么特点,怎样处理这个格式的图片。
因此我们来把重点放在BMP的格式组成上:
BMP其实是图片格式中最简单的一种,一般来说,典型的BMP图像数据文件由四部分组成:
1. 位图文件头数据(BITMAPFILEHEADER):这个数据结构包含了BMP图像文件的类型、大小等信息;
typedef struct targetBITMAPFILEHEADER{
WORD bfType; //文件类型,对于位图来说,这一部分为0x4d42
DWORD bfSize; //文件大小(包含这14字节)
WORD bfReserved1; //保留字,不考虑
WORD bfReserved2; //保留字,同上
DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和
}BITMAPFILEHEADER;
2. 位图信息头数据(BITMAPINFOHEADER):这个数据结构则是包含了BMP图像数据的宽、高、压缩方法、定义颜色、占用空间等等信息;
typedef struct targetBITMAPINFOHEADER{
DWORD biSize; //指定此结构体的长度,为40
LONG biWidth; //位图宽
LONG biHeight; //位图高
WORD biPlanes; //平面数,为1
WORD biBitCount; //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32
DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩
DWORD biSizeImage; //实际位图数据占用的字节数
LONG biXPelsPerMeter; //X方向分辨率
LONG biYPelsPerMeter; //Y方向分辨率
DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数)
DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的
}BITMAPINFOHEADER;
3.调色板(RGBQUAD):其中,这一部分的数据结构是可选择的,有些为徒需要调色板,有些位图则不需要(比如24位的真彩图就不需要);
typedef struct tagRGBQUAD{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}RGBQUAD;
4.位图数据:这部分的内容根据BMP位图使用的位数不同而不同,在24位真彩图中,直接使用RGB,而其他的小于24位的则使用调色板中颜色的索引值。
typedef struct tagIMAGEDATA
{
BYTE blue;
BYTE green;
BYTE red;
}IMAGEDATA;
二、旋转BMP的理论准备
在进行编码之前,我们首先需要知道——旋转BMP需要什么样的准备工作、怎样去做,那么仔细考虑一下其实我们面临的是以下的几个问题:
1. 首先我们在进行旋转的时候应当注意在旋转前与旋转后的坐标对应关系;
2.当我们旋转之后,如果旋转之后的像素点并不是很如人意的落在像素点上,而是落在临近的四个像素点构成的正方形区域内(而且这种情况应该是很常见的一种),我们应当怎样确定旋转之后的像素的颜色值;
3.怎样对图像进行旋转;
4.旋转之后怎样将整个图片显示出来;