bmp文件格式详细解析(转载)
转自:http://blog.chinaunix.net/uid-23592843-id-150648.html
而我们在其它地方看到的又是16色,256色,16777216色等等,这些怎么一回事呢?
16色即代表16种颜色,256色即256种颜色,8位色就是用8个位来表示的颜色,即2的8次方,就是256色,16位色2的16次方,就是65536色,24位即16777216色,32位即4294967296色
他们之间并不存在转换关系,只有兼容关系,你不可能将红色转换为蓝色,也不可能将一个黑白的图片转换成一个彩色图片,但可以将彩色图片变成黑白图片,就像以前的黑白电视机播放彩色录像始终是黑白的,而彩色电视机播放黑白的录像还是黑白的,当由多到少时,它会丢失颜色数据,当由少到多时,并不会还原丢失的数据。
一个bmp文件以BITMAPFILEHEADER结构体开始,
typedef struct tagBITMAPFILEHEADER {
WORD bfType;//固定为0x4d42;
DWORD bfSize; //文件大小
WORD bfReserved1; //保留字,不考虑
WORD bfReserved2; //保留字,同上
DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和
} BITMAPFILEHEADER;
BITMAPFILEHEADER的第1个属性是bfType(2字节),这里恒定等于0x4D42。由于内存中的数据排列高位在左,低位在右,所以内存中从左往右看就显示成(42 4D),所以在winhex中头两个 字节显示为(42 4D)就是这样形成的,以后的数据都是这个特点,不再作重复说明。
BITMAPFILEHEADER的第2个属性是bfSize(4字节),表示整个bmp文件的大小。
BITMAPFILEHEADER的第3个、第4个属性分别是bfReserved1、bfReserved2(各2字节),这里是2个保留属性,都为0,这里等于&H0000、0x0000。
BITMAPFILEHEADER的第5个属性是bfOffBits(4字节),表示DIB数据区在bmp文件中的位置偏移量,比如等于0x00000076=118,表示数据区从文件开始往后数的118字节开始。
BITMAPFILEHEADER结构体这里就讲完了,大家会发现BITMAPFILEHEADER只占了bmp文件开始的14字节长度,但需要 特别说明的是:我们在编程时,经常是以二进制的形式打开一个bmp文件,然后将其开头的14个字节读入自己定义的BITMAPFILEHEADER结构体中,如果按上述定义结构体的方式,需要注意,这个自己定义的结构体在内存中由于字节对齐,会占用16字节的空间,因而直接读入16字节,按字节顺序赋值给结构体,出来的数据是错误的,这样的话,可以先将这14字节的数据读入到一个缓冲器中,然后从缓冲器中按字节对结构体进行赋值。详细程序见后附录。鉴于此中原因,在vb中定义一个BITMAPFILEHEADER结构体变量,其长度占了16个字节,原因就是第1个属性本来应该只分配2个字节,但实际被 分配了4个字节,多出来2个字节,所以如果想保存一张bmp图片,写入BITMAPFILEHEADER结构体时一定要注意这一点。
接下来是BITMAPINFO结构体部分。BITMAPINFO段由两部分组成:BITMAPINFOHEADER结构体和RGBQUAD结构 体。其中RGBQUAD结构体表示图片的颜色信息,有些时候可以省略,一般的24位图片和32位图片都不带RGBQUAD结构体,因为DIB数据区直接表 示的RGB值,一般4位图片和8位图片才带有RGBQUAD结构体。(多少位的图片就是用多少位来表示一个颜色信息,例如4位图片表示用4个bit来表示 一个颜色信息。)一个bmp文件中有没有RGBQUAD结构体,可以根据前面BITMAPFILEHEADER结构体的第5个属性bfOffBits来判 断,因为BITMAPINFOHEADER结构体长度为40bit,如果BITMAPINFOHEADER结构体结束后还未到DIB数据区的偏移量,就说 明接下来的数据是RGBQUAD结构体部分。
下面进入正题BITMAPINFOHEADER部分。
typedef struct tagBITMAPINFOHEADER{
//public:
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;
BITMAPINFOHEADER的第1个属性是biSize(4字节),表示BITMAPINFOHEADER结构体的长度,最常见的长度是40字节。
BITMAPINFOHEADER的第2个属性是biWidth(4字节),表示bmp图片的宽度
BITMAPINFOHEADER的第3个属性是biHeight(4字节),表示bmp图片的高度
BITMAPINFOHEADER的第4个属性是biPlanes(2字节),表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1,这里等于0x0001。
BITMAPINFOHEADER的第5个属性是biBitCount(2字节),表示bmp图片的颜色位数,即1位图(单色或二值图像),8位图,16位图,24位图、32位图等等。
BITMAPINFOHEADER的第6个属性是biCompression(4字节),表示图片的压缩属性,bmp图片是不压缩的,等于0,所以这里为0x00000000。
BITMAPINFOHEADER的第7个属性是biSizeImage(4字节),表示bmp图片数据区的大小,当上一个数值biCompression等于0时,这里的值可以省略不填,所以这里等于0x00000000。
BITMAPINFOHEADER的第8个属性是biXPelsPerMeter(4字节),表示图片X轴每米多少像素,可省略,这里等于0x00000EC3=3779像素/米。
BITMAPINFOHEADER的第9个属性是biYPelsPerMeter(4字节),表示图片Y轴每米多少像素,可省略,这里等于0x00000EC3=3779像素/米。
BITMAPINFOHEADER的第10个属性是biClrUsed(4字节),表示使用了多少个颜色索引表,一般biBitCount属性小于16才会用到,等于0时表示有2^biBitCount个颜色索引表,所以这里仍等于0x00000000。
BITMAPINFOHEADER的第11个属性是biClrImportant(4字节),表示有多少个重要的颜色,等于0时表示所有颜色都很重要,所以这里等于0x00000000。
至此BITMAPINFOHEADER结构体结束。
由于这个图片到这里还未到达DIB数据区的偏移量,或者说由于BITMAPINFOHEADER的第5个属性是biBitCount<16,也就是在1位图(只有两种颜色),4位图(只有2^4=16种颜色),8位图(只有2^8=256种颜色)的情况下,此时会有颜色表,也就是接下来的部分:RGBQUAD结构体。
//调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。
//(调色板结构体个数等于使用的颜色数,即是多少色图就有多少个,4位图16色,就有16个RGBQUAD结构体。)
typedef struct tagRGBQUAD {
//public:
BYTE rgbBlue; //该颜色的蓝色分量
BYTE rgbGreen; //该颜色的绿色分量
BYTE rgbRed; //该颜色的红色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
这里举个4位图也就是16色图的例子:一 个RGBQUAD结构体只占用4字节空间,从左到右每个字节依次表示(蓝色,绿色,红色,未使用)。举例的这个图片我数了数总共有16个RGBQUAD结 构体,由于该图片是4位图,2^4正好等于16,所以它把16种颜色全部都枚举出来了,这些颜色就是一个颜色索引表。颜色索引表编号从0开始,总共16个 颜色,所以编号为0-15。从winhex中可以看到按照顺序,这16个RGBQUAD结构体依次为:
编号:(蓝,绿,红,空)
0号:(00,00,00,00)
1号:(00,00,80,00)
2号:(00,80,00,00)
3号:(00,80,80,00)
4号:(80,00,00,00)
5号:(80,00,80,00)
6号:(80,80,00,00)
7号:(80,80,80,00)
8号:(C0,C0,C0,00)
9号:(00,00,FF,00)
10号:(00,FF,00,00)
11号:(00,FF,FF,00)
12号:(FF,00,00,00)
13号:(FF,00,FF,00)
14号:(FF,FF,00,00)
15号:(FF,FF,FF,00)
到这里,正好满足DIB数据区的偏移量,所以后面的字节就是图片内容了。这里需要提醒的是所有的DIB数据扫描行是上下颠倒的,也就是说一幅图片先绘制底部的像素,再绘制顶部的像素,所以这些DIB数据所表示的像素点就是从图片的左下角开始,一直表示到图片的右上角。
程序附录:
![](/assets/blank.gif)
![](/assets/blank.gif)
1 // std.cpp : Defines the entry point for the console application. 2 // 3 #include "stdafx.h" 4 5 //ReadBitMap 6 // 7 #include <string.h> 8 #include <math.h> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <malloc.h> 12 13 #define WIDTHBYTES(bits) (((bits)+31)/32*4) 14 typedef unsigned char BYTE; 15 typedef unsigned short WORD; 16 typedef unsigned long DWORD; 17 typedef long LONG; 18 19 //位图文件头信息结构定义 20 //其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息) 21 typedef struct tagBITMAPFILEHEADER { 22 WORD bfType;//固定为0x4d42 23 DWORD bfSize; //文件大小 24 WORD bfReserved1; //保留字,不考虑 25 WORD bfReserved2; //保留字,同上 26 DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 27 } BITMAPFILEHEADER; 28 29 //信息头BITMAPINFOHEADER,也是一个结构,其定义如下: 30 typedef struct tagBITMAPINFOHEADER{ 31 //public: 32 DWORD biSize; //指定此结构体的长度,为40 33 LONG biWidth; //位图宽 34 LONG biHeight; //位图高 35 WORD biPlanes; //平面数,为1 36 WORD biBitCount; //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32 37 DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩 38 DWORD biSizeImage; //实际位图数据占用的字节数 39 LONG biXPelsPerMeter; //X方向分辨率 40 LONG biYPelsPerMeter; //Y方向分辨率 41 DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数) 42 DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的 43 } BITMAPINFOHEADER; 44 45 //调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。 46 //(似乎是调色板结构体个数等于使用的颜色数。) 47 typedef struct tagRGBQUAD { 48 //public: 49 BYTE rgbBlue; //该颜色的蓝色分量 50 BYTE rgbGreen; //该颜色的绿色分量 51 BYTE rgbRed; //该颜色的红色分量 52 BYTE rgbReserved; //保留值 53 } RGBQUAD; 54 55 void showBmpHead(BITMAPFILEHEADER* pBmpHead) 56 { 57 printf("位图文件头:\n"); 58 printf("bmp格式标志bftype:0x%x\n",pBmpHead->bfType ); 59 printf("文件大小:%d\n",pBmpHead->bfSize); 60 printf("保留字:%d\n",pBmpHead->bfReserved1); 61 printf("保留字:%d\n",pBmpHead->bfReserved2); 62 printf("实际位图数据的偏移字节数:%d\n",pBmpHead->bfOffBits); 63 } 64 65 void showBmpInforHead(tagBITMAPINFOHEADER* pBmpInforHead) 66 { 67 printf("位图信息头:\n"); 68 printf("结构体的长度:%d\n",pBmpInforHead->biSize); 69 printf("位图宽:%d\n",pBmpInforHead->biWidth); 70 printf("位图高:%d\n",pBmpInforHead->biHeight); 71 printf("biPlanes平面数:%d\n",pBmpInforHead->biPlanes); 72 printf("biBitCount采用颜色位数:%d\n",pBmpInforHead->biBitCount); 73 printf("压缩方式:%d\n",pBmpInforHead->biCompression); 74 printf("biSizeImage实际位图数据占用的字节数:%d\n",pBmpInforHead->biSizeImage); 75 printf("X方向分辨率:%d\n",pBmpInforHead->biXPelsPerMeter); 76 printf("Y方向分辨率:%d\n",pBmpInforHead->biYPelsPerMeter); 77 printf("使用的颜色数:%d\n",pBmpInforHead->biClrUsed); 78 printf("重要颜色数:%d\n",pBmpInforHead->biClrImportant); 79 } 80 void showRgbQuan(tagRGBQUAD* pRGB) 81 { 82 printf("(%-3d,%-3d,%-3d) ",pRGB->rgbRed,pRGB->rgbGreen,pRGB->rgbBlue); 83 } 84 85 void main() 86 { 87 BITMAPFILEHEADER bitHead; 88 BITMAPINFOHEADER bitInfoHead; 89 FILE* pfile; 90 char strFile[50]; 91 char *BmpFileHeader; 92 WORD *temp_WORD; 93 DWORD *temp_DWORD; 94 printf("please input the .bmp file name:\n"); 95 scanf("%s",strFile); 96 97 pfile = fopen(strFile,"rb");//打开文件 98 BmpFileHeader=(char *)calloc(14,sizeof(char)); 99 if(pfile!=NULL) 100 { 101 printf("file bkwood.bmp open success.\n"); 102 //读取位图文件头信息 103 104 105 106 fread(BmpFileHeader,1,14,pfile); 107 temp_WORD=(WORD* )(BmpFileHeader); 108 bitHead.bfType=*temp_WORD; 109 if(bitHead.bfType != 0x4d42) 110 { 111 printf("file is not .bmp file!"); 112 113 return; 114 } 115 temp_DWORD=(DWORD *)(BmpFileHeader+sizeof(bitHead.bfType)); 116 bitHead.bfSize=*temp_DWORD; 117 temp_WORD=(WORD*)(BmpFileHeader+sizeof(bitHead.bfType)+sizeof(bitHead.bfSize)); 118 bitHead.bfReserved1=*temp_WORD; 119 temp_WORD=(WORD*)(BmpFileHeader+sizeof(bitHead.bfType)+sizeof(bitHead.bfSize)+sizeof(bitHead.bfReserved1)); 120 bitHead.bfReserved2=*temp_WORD; 121 temp_DWORD=(DWORD*)(BmpFileHeader+sizeof(bitHead.bfType)+sizeof(bitHead.bfSize)+sizeof(bitHead.bfReserved1)+sizeof(bitHead.bfReserved2)); 122 bitHead.bfOffBits=*temp_DWORD; 123 124 125 126 showBmpHead(&bitHead); 127 printf("\n\n"); 128 129 //读取位图信息头信息 130 fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile); 131 showBmpInforHead(&bitInfoHead); 132 printf("\n"); 133 134 } 135 else 136 { 137 printf("file open fail!\n"); 138 return; 139 } 140 141 tagRGBQUAD *pRgb ; 142 if(bitInfoHead.biBitCount < 24)//有调色板 143 { 144 //读取调色盘结信息 145 long nPlantNum = long(pow(2,double(bitInfoHead.biBitCount))); // Mix color Plant Number; 146 pRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD)); 147 memset(pRgb,0,nPlantNum*sizeof(tagRGBQUAD)); 148 int num = fread(pRgb,4,nPlantNum,pfile); 149 printf("Color Plate Number: %d\n",nPlantNum); 150 printf("颜色板信息:\n"); 151 for (int i =0; i<nPlantNum;i++) 152 { 153 if (i%5==0) 154 { 155 printf("\n"); 156 } 157 showRgbQuan(&pRgb[i]); 158 } 159 printf("\n"); 160 } 161 162 int width = bitInfoHead.biWidth; 163 int height = bitInfoHead.biHeight; 164 //分配内存空间把源图存入内存 165 int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为32的倍数 166 BYTE *pColorData=(BYTE *)malloc(height*l_width); 167 memset(pColorData,0,height*l_width); 168 long nData = height*l_width; 169 //把位图数据信息读到数组里 170 fread(pColorData,1,nData,pfile); 171 172 //将位图数据转化为RGB数据 173 tagRGBQUAD* dataOfBmp; 174 dataOfBmp = (tagRGBQUAD *)malloc(width*height*sizeof(tagRGBQUAD));//用于保存各像素对应的RGB数据 175 memset(dataOfBmp,0,width*height*sizeof(tagRGBQUAD)); 176 if(bitInfoHead.biBitCount<24)//有调色板,即位图为非真彩色 177 { 178 int k; 179 int index = 0; 180 if (bitInfoHead.biBitCount == 1) 181 { 182 for(int i=0;i<height;i++) 183 for(int j=0;j<width;j++) 184 { 185 BYTE mixIndex= 0; 186 k = i*l_width + j/8;//k:取得该像素颜色数据在实际数据数组中的序号 187 //j:提取当前像素的颜色的具体值 188 mixIndex = pColorData[k]; 189 switch(j%8) 190 { 191 case 0: 192 mixIndex = mixIndex<<7; 193 mixIndex = mixIndex>>7; 194 break; 195 case 1: 196 mixIndex = mixIndex<<6; 197 mixIndex = mixIndex>>7; 198 break; 199 case 2: 200 mixIndex = mixIndex<<5; 201 mixIndex = mixIndex>>7; 202 break; 203 case 3: 204 mixIndex = mixIndex<<4; 205 mixIndex = mixIndex>>7; 206 break; 207 case 4: 208 mixIndex = mixIndex<<3; 209 mixIndex = mixIndex>>7; 210 break; 211 case 5: 212 mixIndex = mixIndex<<2; 213 mixIndex = mixIndex>>7; 214 break; 215 case 6: 216 mixIndex = mixIndex<<1; 217 mixIndex = mixIndex>>7; 218 break; 219 case 7: 220 mixIndex = mixIndex>>7; 221 break; 222 } 223 //将像素数据保存到数组中对应的位置 224 dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbRed; 225 dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbGreen; 226 dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbBlue; 227 dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbReserved; 228 index++; 229 } 230 } 231 if(bitInfoHead.biBitCount==2) 232 { 233 for(int i=0;i<height;i++) 234 for(int j=0;j<width;j++) 235 { 236 BYTE mixIndex= 0; 237 k = i*l_width + j/4;//k:取得该像素颜色数据在实际数据数组中的序号 238 //j:提取当前像素的颜色的具体值 239 mixIndex = pColorData[k]; 240 switch(j%4) 241 { 242 case 0: 243 mixIndex = mixIndex<<6; 244 mixIndex = mixIndex>>6; 245 break; 246 case 1: 247 mixIndex = mixIndex<<4; 248 mixIndex = mixIndex>>6; 249 break; 250 case 2: 251 mixIndex = mixIndex<<2; 252 mixIndex = mixIndex>>6; 253 break; 254 case 3: 255 mixIndex = mixIndex>>6; 256 break; 257 } 258 //将像素数据保存到数组中对应的位置 259 dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbRed; 260 dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbGreen; 261 dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbBlue; 262 dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbReserved; 263 index++; 264 265 } 266 } 267 if(bitInfoHead.biBitCount == 4) 268 { 269 for(int i=0;i<height;i++) 270 for(int j=0;j<width;j++) 271 { 272 BYTE mixIndex= 0; 273 k = i*l_width + j/2; 274 mixIndex = pColorData[k]; 275 if(j%2==0) 276 {//低 277 mixIndex = mixIndex<<4; 278 mixIndex = mixIndex>>4; 279 } 280 else 281 {//高 282 mixIndex = mixIndex>>4; 283 } 284 dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbRed; 285 dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbGreen; 286 dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbBlue; 287 dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbReserved; 288 index++; 289 } 290 } 291 if(bitInfoHead.biBitCount == 8) 292 { 293 for(int i=0;i<height;i++) 294 for(int j=0;j<width;j++) 295 { 296 BYTE mixIndex= 0; 297 k = i*l_width + j; 298 mixIndex = pColorData[k]; 299 dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbRed; 300 dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbGreen; 301 dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbBlue; 302 dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbReserved; 303 index++; 304 305 } 306 } 307 if(bitInfoHead.biBitCount == 16) 308 { 309 for(int i=0;i<height;i++) 310 for(int j=0;j<width;j++) 311 { 312 WORD mixIndex= 0; 313 k = i*l_width + j*2; 314 WORD shortTemp; 315 shortTemp = pColorData[k+1]; 316 shortTemp = shortTemp<<8; 317 mixIndex = pColorData[k] + shortTemp; 318 dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbRed; 319 dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbGreen; 320 dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbBlue; 321 dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbReserved; 322 index++; 323 } 324 } 325 } 326 else//位图为24位真彩色 327 { 328 int k; 329 int index = 0; 330 for(int i=0;i<height;i++) 331 for(int j=0;j<width;j++) 332 { 333 k = i*l_width + j*3; 334 dataOfBmp[index].rgbRed = pColorData[k+2]; 335 dataOfBmp[index].rgbGreen = pColorData[k+1]; 336 dataOfBmp[index].rgbBlue = pColorData[k]; 337 index++; 338 } 339 } 340 341 printf("像素数据信息:\n"); 342 /* 343 for (int i=0; i<width*height; i++) 344 { 345 if (i%5==0) 346 { 347 printf("\n"); 348 } 349 showRgbQuan(&dataOfBmp[i]); 350 } 351 */ 352 fclose(pfile); 353 354 if (bitInfoHead.biBitCount<24) 355 { 356 free(pRgb); 357 } 358 free(dataOfBmp); 359 free(pColorData); 360 free(BmpFileHeader); 361 printf("\n"); 362 }
View Code
转载于:https://www.cnblogs.com/onestow/p/4350424.html
bmp文件格式详细解析(转载)相关推荐
- bmp文件格式详细解析
先区分几个概念:16色和16位色一样吗? 不一样! 颜色位数,即是用多少位字节表示的值,每一位可以表示0和1两值.通常图片的颜色深度,简称色深,就是用位数来表示的,所以,我通常会看到8位色,16位色, ...
- android4.0蓝牙使能的详细解析 (转载)
2019独角兽企业重金招聘Python工程师标准>>> 此博客是转载过来的哦... 给自己博客定几个部分: (1)写在前面的话:一些写博客时的废话. (2)内容简介:把文章的主要内容 ...
- PE文件格式详细解析(二)
3.PE文件的结构 3.2 NT头 由一个IMAGE_NT_HEADERS结构组成,该结构中包含了PE文件被载入内存时需要用到的重要域.通过DOS header中的e_lfanew,可以直接定位到真正 ...
- 【剧透高亮】最最最完整剧透加剧情详细解析
在美国看的,IMAX大厅爆满!只能缩在角落里的位置看,但是还是不影响观影过程,被震撼到不行!看到最后黑洞的情节都快哭出来跪在地上了!Hans Zimmer的配乐太结棍了啊! 就像诺兰所有的电影一样, ...
- 《新武林传奇》大侠能力详细解析
为什么80%的码农都做不了架构师?>>> 在国内首款武侠消除游戏<新武林传奇>中,想要成功闯荡江湖称霸武林,自然不能缺少极品大侠的协助.那么如何才能判断一位大侠是否 ...
- BMP文件格式解析(有调色板)
BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广 ...
- 位图(bmp)文件格式分析
from:https://blog.csdn.net/qingchuwudi/article/details/25785307 位图(bmp)文件格式分析 作者:深蓝(由博主分享) 一.什么是位图 计 ...
- BMP文件格式详解(BMP file format)
BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式.由于它可以不作任何变换地保存图像 ...
- BMP图片的解析,关于压缩方式
在做一个显示bmp图片到lcd屏的时候,发现有些bmp图显示不对. 同样是16bit bmp却有差异. 就查了一下格式. bmp文件格式 位图文件的组成 结构名称 符号 位图文件头(bitmap-fi ...
最新文章
- 64位centos 下编译 hadoop 2.6.0 源码
- Python3 字符串切片 slice 操作
- mugen4g补丁如何使用_客户端与WSUS如何连接,补丁审批,下载安装(3)
- Linux uniq命令
- SAP CRM, C4C和Hybris的后台作业
- mysql 安装盒子_Windows2008 装 MySQL 问题
- Kotlin的继承(二)
- 创业者如何更好地认知世界?
- 不懂得使用工具的测试不是好测试
- CSS基础——盒子模型【学习笔记】
- Elasticsearch6.3.0安装Ansj分词插件
- VBA的表单控件初接触(2):ActiveX控件的基础功能和基础代码
- 《程序员的职业素养》
- 利用stm32读取思岚A1雷达数据
- RFT API初涉——之解决RFT无法识别windows对话框的问题
- 怎样测试手机性能软件,如何检测手机性能的软件
- 后退一步 小程序_微信小程序:如何利用navigateBack退出小程序
- AppleParty(苹果派)v3 支持 App Store 新定价机制 - 批量配置自定价格和销售范围
- DIL中基本数据类型
- NBD Network Block Device
热门文章
- µC/OS-II 系统空闲任务,统计任务和应用任务
- oracle程序包写法,Oracle学习笔记20150913pl/sql编程包的写法
- react-useId
- 计算机专业实习的重要性
- [转]技术领导要不要写代码?
- C++游戏辅助开发实战x64游戏逆向汇编封包游戏安全攻防反调试
- 统一IE和世界之窗的User Agent标示(重启后生效)是什么意思啊
- java公寓项目介绍_青年公寓--项目总体介绍.docx
- 找不到javax.servlet.jsp.tagext.TagSupport或TagSupport类需要引用的jar包或maven依赖
- Java Swing实现小游戏集合源码