bmp图像的读取
完整程序_C语言对BMP图像的读和写和对像素的操作
![完整程序_C语言对BMP图像的读和写和对像素的操作](https://img.taocdn.com/s3/m/df4bc9d0240c844769eaee37.png)
#include <stdio.h>#include "Windows.h"BOOL readBmp(char *bmpName);BOOL saveBmp(char *bmpName, char *imgBuf, int width, int heigh, int biBitCount, RGBQUAD *pColorTable);char *pBmpBuf; //位图数据int bmpWidth; // 图像宽度int bmpHeight; //图像高度int biBiCount; //图像类型,每像素位数RGBQUAD *pColorTable; //位图颜色表指针int main(){char readName[] = "read.BMP";readBmp(readName);char writeName[] = "write.BMP";saveBmp(writeName, pBmpBuf, bmpWidth, bmpHeight, biBiCount, pColorTable);int lineByte = (bmpWidth*bmpHeight/8+3)/4*4;if (biBiCount == 8){for (int i = 0; i < bmpWidth/2; i++){for (int j = 0; j < bmpHeight/2; j++){*(pBmpBuf+i*lineByte+j) = 0;}}}else if (biBiCount == 24){/////对于24位真彩图,每个像素占三个字节分别存储R、G、B三个颜色分量的颜色值for (int i = 0; i < bmpWidth/2; i++){for (int j = 0; j < bmpHeight/2; j++){for (int k = 0; k < 3; k++)*(pBmpBuf+i*lineByte+j*3+k) = 0; //将rgb三个颜色分量设置成黑色}}}char Name[] = "copy.BMP";saveBmp(Name, pBmpBuf, bmpWidth, bmpHeight, biBiCount, pColorTable);delete []pBmpBuf;if (biBiCount == 8){delete []pColorTable;}return 0;}BOOL readBmp(char *bmpName ){FILE *pf = fopen(bmpName, "rb");if (pf == NULL) return FALSE;printf("read %s succeeded!\n", bmpName);fseek(pf, sizeof(BITMAPFILEHEADER), SEEK_SET);BITMAPINFOHEADER infoHeader;fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pf);bmpWidth = infoHeader.biWidth;bmpHeight = infoHeader.biHeight;biBiCount = infoHeader.biBitCount;//图像每行的字节数,一定要是4的倍数int lineByte = (bmpWidth*bmpHeight/8+3)/4*4;pBmpBuf = new char[lineByte*bmpHeight];//灰度图像有颜色表if (biBiCount == 8){pColorTable = new RGBQUAD[256];fread(pColorTable, sizeof(RGBQUAD), 1, pf);}fread(pBmpBuf, lineByte*bmpHeight, 1, pf);fclose(pf); //关闭文件return TRUE;}BOOL saveBmp(char *bmpName, char *imgBuf, int width, int heigh, int biBitCount, RGBQUAD *pColorTable ){FILE *pf = fopen(bmpName, "wb");if (pf == NULL) return FALSE;printf("write %s succeeded!\n", bmpName);//写头文件int colorTableSize = 0;if (biBitCount == 8){colorTableSize = 1024;}int lineByte = (width*heigh/8+3)/4*4;BITMAPFILEHEADER filehead;filehead.bfOffBits = 54+colorTableSize;filehead.bfType = 0x4D42;filehead.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTableSize+lineByte*heig h;filehead.bfReserved1 = 0;filehead.bfReserved2 = 0;fwrite(&filehead, sizeof(BITMAPFILEHEADER), 1, pf);BITMAPINFOHEADER infoHead;infoHead.biBitCount = biBitCount;infoHead.biWidth = width;infoHead.biHeight = heigh;infoHead.biSize = 40;infoHead.biClrImportant = 0;infoHead.biSizeImage = lineByte*heigh;infoHead.biClrUsed = 0;infoHead.biPlanes = 1;infoHead.biXPelsPerMeter = 0;infoHead.biYPelsPerMeter = 0;fwrite(&infoHead,sizeof(BITMAPINFOHEADER), 1, pf);if (biBitCount == 8){fwrite(pColorTable, sizeof(RGBQUAD), 256, pf);}fwrite(pBmpBuf, lineByte*heigh, 1, pf);fclose(pf);return TRUE;}。
用c语言读取并显示bmp图像1
![用c语言读取并显示bmp图像1](https://img.taocdn.com/s3/m/9830041033687e21af45a9d2.png)
如何在WIN-TC中或TC++3.0中把一张BMP格式的图片显示出来?下面的是<<C & C++编程实例>>随书光盘上的代码,我在TC2.0下编译通过.它是利用了抖动技术显示了8bit和24bit的位图(也就是256色和16M色位图),应该能满足你的需要.不过,我想问下,你老师教过抖动显示吗?#include <stdio.h>#include <dos.h>#include <stdio.h>#include <conio.h>#define NoError 0#define ErrorFileOpen 1#define ErrorFileType 2#define ErrorImageColor 3typedef struct tagBITMAPFILEHEADER{unsigned int bfType;unsigned long bfSize;unsigned int bfReserved1;unsigned int bfReserved2;unsigned long bfoffBits;}BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{unsigned long biSize;unsigned long biWidth;unsigned long biHeight;unsigned int biPlanes;unsigned int biBitCount;unsigned long biCompression;unsigned long biSizeImage;unsigned long biXPelsPerMeter;unsigned long biYPelsPerMeter;unsigned long biClrUsed;unsigned long biClrImportant;} BITMAPINFOHEADER;typedef struct tagRGBQUAD{unsigned char rgbBlue;unsigned char rgbGreen;unsigned char rgbRed;unsigned char rgbReserved;} RGBQUAD;unsigned char PalReg[17]= { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0}; unsigned char StandardPal[48]= {0, 0, 0, 32, 0, 0, 0,32, 0, 32,32, 0, 0, 0,32, 32, 0,32, 0,32,32, 32,32, 32, 48, 48,48, 63, 0, 0, 0,63, 0, 63,63, 0, 0, 0,63, 63, 0,63, 0,63,63, 63,63,63, };unsigned char LightnessMatrix [16][16]= {{ 0,235,59,219,15,231,55,215,2,232,56,217,12,229,52,213},{128,64,187,123,143,79,183,119,130,66,184,120,140,76,180,116},{33,192,16,251,47,207,31,247,34,194,18,248,44,204,28,244},{161,97,144,80,175,111,159,95,162,98,146,82,172,108,156,92},{8,225,48,208,5,239,63,223,10,226,50,210,6,236,60,220},{136,72,176,112,133,69,191,127,138,74,178,114,134,70,188,124},{41,200,24,240,36,197,20,255,42,202,26,242,38,198,22,252},{169,105,152,88,164,100,148,84,170,106,154,90,166,102,150,86},{3,233,57,216,13,228,53,212,1,234,58,218,14,230,54,214},{131,67,185,121,141,77,181,117,129,65,186,122,142,78,182,118},{35,195,19,249,45,205,29,245,32,193,17,250,46,206,30,246},{163,99,147,83,173,109,157,93,160,96,145,81,174,110,158,94},{11,227,51,211,7,237,61,221,9,224,49,209,4,238,62,222},{139,75,179,115,135,71,189,125,137,73,177,113,132,68,190,126},{43,203,27,243,39,199,23,253,40,201,25,241,37,196,21,254},{171,107,155,91,167,103,151,87,168,104,153,89,165,101,149,85},};unsigned char ColorTable[2][2][2]= {{{0,12},{10,14}},{{9,13},{11,15}}}; unsigned char ColorMap[256][3];int ShowBmp(char *FileName);int GetColor(unsigned char R,unsigned char G, unsigned char B,int X,int Y); void SetVideoMode(unsigned char Mode);void SetPalReg(unsigned char *palReg);void SetDacReg(unsigned char *DacReg, int Color, int Count);void PutPixel(int X, int Y, unsigned char Color);/* 主函数*/void main (int argc, char *argv[]){if(argc!=2){printf("Usage:\tSHOW Filename.BMP\n");exit(1);}ShowBmp(argv[1]);}/* 根据图像文件名,读取图像内容并利用抖动技术进行显示*/ int ShowBmp(char *FileName){FILE *Fp;BITMAPFILEHEADER FileHead;BITMAPINFOHEADER InfoHead;RGBQUAD RGB;int N, W,Y,X,C,Color;unsigned char Buffer[4096];Fp=fopen(FileName,"rb");if (Fp==NULL)return(ErrorFileOpen);fread(&FileHead,sizeof(BITMAPFILEHEADER),1,Fp);if(FileHead.bfType!='BM'){fclose(Fp);return(ErrorFileType);}fread(&InfoHead,sizeof(BITMAPINFOHEADER),1,Fp);if(InfoHead.biBitCount!=8 && InfoHead.biBitCount!=24){fclose(Fp);return(ErrorImageColor);}/* 设置显示模式和显示区域*/SetVideoMode(0x12);SetPalReg(PalReg);SetDacReg(StandardPal,0,16);/* 对两种不同色彩数的图像分别进行处理*/if(InfoHead.biBitCount==8) /* 256色*/{for (N=0;N<256;N++){fread(&RGB, sizeof(RGBQUAD),1,Fp);ColorMap[N][0]=RGB.rgbRed;ColorMap[N][1]=RGB.rgbGreen;ColorMap[N][2]=RGB.rgbBlue;}W=(InfoHead.biWidth+3)/4*4;for(Y=InfoHead.biHeight-1;Y>=480;Y--)fread(Buffer,sizeof(unsigned char),W,Fp);for(;Y>0;Y--){fread(Buffer,sizeof(unsigned char),W,Fp);for (X=0;X<InfoHead.biWidth && X<640;X++){C=Buffer[X];Color=GetColor(ColorMap[C][0],ColorMap[C][1],ColorMap[C][2],X,Y); PutPixel (X,Y,Color);}}}else /* 24bits真彩色*/{W=(InfoHead.biWidth*3+3)/4*4;for(Y=InfoHead.biHeight-1;Y>639;Y--)fread(Buffer,sizeof(unsigned char),W,Fp);for(;Y>=0;Y--){fread(Buffer,sizeof(unsigned char),W,Fp);for(X=0;X<InfoHead.biWidth && X<640;X++){C=X*3;Color=GetColor(Buffer[C+2],Buffer[C+1],Buffer[C],X,Y);PutPixel(X,Y,Color);}}}getch();fclose(Fp);SetVideoMode(0x03);return(NoError);}int GetColor(unsigned char R, unsigned char G, unsigned char B, int X, int Y) {unsigned int L=LightnessMatrix[Y & 0x0F][X & 0x0F];return(ColorTable[(unsigned int)R*256/255>L][(unsigned int)G*256/255>L][(unsigned int)B*256/255>L]); }void SetVideoMode(unsigned char Mode){_AH=0x00;_AL=Mode;geninterrupt(0x10);}void SetPalReg(unsigned char *PalReg){_ES=FP_SEG((unsigned char far*)PalReg);_DX=FP_OFF((unsigned char far*)PalReg);_AX=0x1002;geninterrupt(0x10);}void SetDacReg(unsigned char *DacReg,int Color,int Count){_ES=FP_SEG((unsigned char far*)DacReg);_DX=FP_OFF((unsigned char far*)DacReg);_AX=0x1012;_BX=Color;_CX=Count;geninterrupt(0x10);}/* 在对应位置显示像素色彩*/void PutPixel(int X, int Y, unsigned char Color){_AH=0x0C;_AL=Color;_CX=X;_DX=Y;geninterrupt(0x10);}16色位图的显示文:吴进/Luckylai对于象大家常用TC的16色图形模式编程的初学者,如果能在程序里使用图片那就会方便很多了,以前在TC256上看见吴进写的《TC的16色BMP闪电显示(66k) 》的代码,发现写的的确不错,而且绝对能在TC的initgraph()初始化的BGI模式下使用。
bmp读取详解
![bmp读取详解](https://img.taocdn.com/s3/m/3603101d6bd97f192279e914.png)
bmp读取详解BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。
<?xml:namespace prefix = o ns ="urn:schemas-microsoft-com:office:office" />位图文件主要分为如下3个部分:块名称对应Windows结构体定义大小(Byte)文件信息头BITMAPFILEHEADER 14位图信息头BITMAPINFOHEADER 40RGB颜色阵列BYTE* 由图像长宽尺寸决定1、文件信息头BITMAPFILEHEADER结构体定义如下:typedef struct tagBITMAPFILEHEADER {WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER;其中:bfType 说明文件的类型,该值必需是0x4D42,也就是字符'BM'。
bfSize 说明该位图文件的大小,用字节为单位,即整个图像文件的存储需要多少存储空间。
bfReserved1 保留,必须设置为0 bfReserved2 保留,必须设置为0bfOffBits 说明从文件头开始到实际的图象数据之间的字节的偏移量。
这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。
2、位图信息头BITMAPINFOHEADER结构体定义如下:typedef struct tagBITMAPINFOHEADER {DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER;其中:biSize 说明BITMAPINFOHEADER结构所需要的字数。
读取并在屏幕上显示24位bmp图像
![读取并在屏幕上显示24位bmp图像](https://img.taocdn.com/s3/m/c0d7443a763231126edb114e.png)
读取并在屏幕上显示24位bmp图像PS:本文非原创,code来自互联网。
代码如下:/*这里仅仅是一个简单的显示也可以写出适用于各种OpenGL使用例如设置我们甚至可以使用负的系数,使得整个图象进行水平方向或垂直方向的翻转(默认像素从左绘制到右,但翻转后将从右绘制到左。
默认像素从下绘制到上,但翻转后将从上绘制到下。
因此,*/ opengl#include <gl/#definestaticstaticstaticstaticstatic#include <stdio.h>#include <stdlib.h>void{////// glClear(GL_COLOR_BUFFER_BIT);//GL_glutSwapBuffers();}int{FILE* pFile = fopen(str,exit(fseek(pFile,fread(&ImageWidth,fread(&ImageHeight,PixelLength = ImageWidth *++PixelLength;PixelLength *= ImageHeight;exit(fseek(pFile,fread(fclose(pFile);glutInit(&argc, argv);glutInitDisplayMode(GLUT_glutInitWindowPosition(glutInitWindowSize(ImageWidth, ImageHeight);glutCreateWindow(FileName);glutDisplayFunc(&display);glutMainLoop();}显示结果截图如下:为方便理解程序,下面把网上找的关于部分bmp图像格式的说明也写在下面了,如果还想了解的更清楚,就自己再google下,很多相关资料的。
BMP文件是一种像素文件,它保存了一幅图象中所有的像素。
BMP图像信息隐藏及检测
![BMP图像信息隐藏及检测](https://img.taocdn.com/s3/m/a87cfc30f01dc281e43af002.png)
《信息隐藏与数字水印》实验报告实验二 BMP图像信息隐藏及检测1.实验目的(1)了解BMP图像文件格式(2)了解利用BMP图像文件隐藏信息的原理(3)掌握基于24位真彩色BMP图像的文件信息隐藏方法2.实验内容(1)在图像数据后隐藏信息(2)文件头与图像数据之间隐藏信息(3)BMP图像文件隐藏信息的检测(4)在图像文件头和信息头的保留字段中的隐藏信息(5)灰度、二值图像的其他信息隐藏及检测(扩展)3.实验原理针对文件结构的信息隐藏方法需详细掌握文件的格式,利用文件结构块之间的关系或根据块数据和块大小之间的关系来隐藏信息。
BMP ( Bitmap-File)图形文件是Windows采用的常见图形文件格式,要利用BMP位图进行信息隐藏首先需要详细了解BMP文件的格式,BMP图像文件结构比较单一而且固定,BMP 图像由文件头、信息头、调色板区和数据区四个部分组成,而24位真彩色图像中没有调色板信息。
24位真彩色BMP位图文件包括3部分。
第一部分是BMP文件头。
前2个字节是“BM”,是用于识别BMP文件的标志;第3,4,5,6字节存放的是位图文件的大小,以字节为单位;第7,8,9,10字节是保留的,必须为0;第11,12,13,14字节给出位图阵列相对于文件头的偏移,在24位真彩色图像中,这个值固定为54;第19,20,21,22字节表示的是图像文件的宽度,以像素为单位;第23,24, 25, 26表示的是图像文件的高度,以像素为单位。
第二部分是位图信息头。
从第29个字节开始,第29,30字节描述的是像素的位数,24位真彩色位图。
该位的值为0x18; 第三部分是数据区。
从第55个字节开始,每3个字节表示一个像素,这3个字节依次表示该像素的红、绿、蓝亮度分量值。
在不影响图像正常显示情况下,可使用以下四种方法在24位真彩色BMP图像中隐藏信息。
●在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中文件长度的值即可。
1 怎样读取BMP文件中的像素数据与显示位图
![1 怎样读取BMP文件中的像素数据与显示位图](https://img.taocdn.com/s3/m/306b2d07d1f34693dbef3e37.png)
怎样读取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 先按上述方法读取位图数据,再将读取数据予以显示。
在lcd上显示bmp图像【转载】
![在lcd上显示bmp图像【转载】](https://img.taocdn.com/s3/m/636d3e7b24c52cc58bd63186bceb19e8b8f6ec72.png)
在lcd上显⽰bmp图像【转载】要实现在lcd上实时显⽰usb摄像头采集的图像,前⾯已经能够采集到图像了,并保存为jpg⽂件,现在要在lcd上显⽰这个图⽚,有⼏种⽅法:⼀种是移植好minigui,然后使⽤minigui提供的函数FillBoxWithBitmap显⽰图像;⼀种是直接将图像数据写⼊framebuffer中,不管使⽤哪种前提是要把jpg⽂件解压得到RGB24数据流。
最后决定使⽤framebuffer,这样可以了解⼀些底层的东西。
这⾥先介绍如何在framebuffer上绘图,⾸先有两个结构体struct fb_fix_screeninfo 和struct fb_var_screeninfo,应⽤程序通过这两个结构体可以获取framebuffer设备相关参数。
定义两个变量struct fb_fix_screeninfo finfo;struct fb_var_screeninfo vinfo;int fb = open("/dev/fb0", O_RDWR);ioctl ( fb, FBIOGET_FSCREENINFO, &finfo)//获取与Framebuffer有关的固定的信息ioctl( fb, FBIOGET_VSCREENINFO, &vinfo)//获取与Framebuffer有关的可变信息应⽤程序中通常要⽤到struct fb_var_screeninfo的下⾯这⼏个字段:xres、yres、bits_per_pixel,分别表⽰x轴的分辨率、y轴的分辨率以及每像素的颜⾊深度(每个像素占⽤的⽐特数)。
与Framebuffer设备有关的IO通常都是通过mmap()系统调⽤来完成的。
系统调⽤mmap()⽤来实现内存映射IO。
所谓内存映射IO,是指将⼀个磁盘⽂件的内容与内存中的⼀个空间相映射。
当从这个映射内存空间中取数据时,就相当于从⽂件中读取相应的字节,⽽当向此映射内存空间写⼊数据时,就相当于向磁盘⽂件中写⼊数据。
图像处理Bmp文件存储顺序
![图像处理Bmp文件存储顺序](https://img.taocdn.com/s3/m/af71f10479563c1ec5da71dd.png)
读写Bmp文件的方法步骤:读:1.读方式打开文件2.读入BITMAPFILEHEADER结构3.读入BITMAPINFOHEADER结构4.读入颜色表RGBQUAD结构5.读入位图数据6.关闭文件写:1.写方式打开文件2.填写BITMAPFILEHEADER结构并写入文件3.写入BITMAPINFHEADER结构并写入文件4.写颜色表进文件5.写位图数据进文件6.关闭文件①:位图文件头BITMAPFILEHEADER: (14字节)bfType :位图文件类型(0x4D42)bfSize :位图文件大小bfReserved1: Windows保留字1bfReserved2: Windows保留字2bfOffBits: 从文件头到实际位图数据的偏移字节数=文件头+ 信息头+调色板长度。
②:位图信息头(40字节)biSize: 本结构长度为40字节biWidth: 位图宽度,(像素为单位)biHeight: 位图的高度,(像素为单位)biPlanes: 设为1biCount: 位深度biCompression: 为0:不压缩;1:8位压缩;2:4位压缩。
biSizeImage:实际的位图数据占用的字节数biXPelsPerMeter:水平分辨率(像素/米)biYPelPerMeter: 垂直分辨率(像素/米)biClrCount:位图实际用到的颜色数(为0时,颜色数为2的biBitCount次幂)biClrImportant:位图显示过程中重要的颜色数(0:都是重要的)③:颜色表(4字节)rgbBlue:蓝色分量rgbGreen:绿色分量rgbRed: 红色分量rgbReserved:保留字节颜色表的大小:二值图像:大小=2*sizeof(RGBQUAD)=88位灰度图像:大小= 256*sizeof(RGBQUAD)= 102424位真彩色图像无颜色表④位图数据8位灰度图像ColorTablesize = 1024;lineByte =(bmpWidth * biBitCount / 8 + 3)/4 *4;1.申请位图文件头结构变量,并填写文件头信息BITMAPFILEHEADER fileHeader;fileHead.bfType = 0x4D42; //bmp类型//bfSize是图像文件4个组成部分之和fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAOINFOHEADER) + ColorTablesize + lineByte*Height;fileHeader.bfReserved1 = 0;fileHeader.bfReserved2 = 0;//bfOffBits是图像文件前3部分所需空间之和fileHead.bfOffBits = 54 + ColorTablesize;2.申请位图信息头结构变量,填写信息头信息BITMAPINFOHEADER head;head.biBitCount = biBitCount;head.biClrImportant = 0;head.biClrUsed = 0;head.biCompression = 0;head.biHeight = height;head.biSize = 40;head.biSizeImage = lineByte * height;head.biWidth = width;head.biXPelsPerMeter = 0;head.biYPelsPerMete = 0;3.写灰度图像的颜色表4.写位图数据进文件调色板句柄HPALETTE文件头指针LPBITMAFILEHEADER : m_lpDib信息头指针LPBITMAPINFOHEADER :m_lpBmpInfoHead 颜色表LPRGBQUAD : m_lpColorTable 信息指针LPBITMAPINFO :m_lpBmpInfo图像数据指针:m_pImgData (包括:信息头指针和颜色表)1读入一幅图像(即打开操作):将四部分都考虑进去(1,2,3,4);2写入一幅图像(即保存操作):将四部分都考虑进去(1,2,3,4)3显示一幅图像:只需将3部分考虑进去(2,3,4)4 处理一幅图像:只需将3部分考虑进去(2,3,4)位图显示和数据处理:将(位图信息头、颜色表)即:信息指针内容,位图数据指针依次写入,并进行操作。
Matlab如何实现BMP读取
![Matlab如何实现BMP读取](https://img.taocdn.com/s3/m/17a9319082d049649b6648d7c1c708a1284a0a9f.png)
一、前言MATLAB是集数值计算,符号运算及图形处理等强大功能于一体的科学计算语言。
作为强大的科学计算平台,它几乎能够满足所有的计算需求。
自MA TLAB4.0问世以来,M A TLAB语言就一直受到工程应用的各个领域的学者和工程师们的关注。
2001年M a thwo rks公司又推出了强大的MATLAB升级版本M A TLAB6.0,使其在符号运算和图形处理功能上得到了进一步完善。
除此之外,新版本的MA TLAB还增强了它的各种应用工具箱,使MATLA B的应用面越来越广,功能也越来越强大。
因此MATL AB已成为最为普遍的计算工具之一。
MATLAB软件具有很强的开放性和适用性。
在保持内核不便的情况下,MATLAB可以针对不同的应用学科推出相应的工具箱(t oolbo x)。
目前,MATLAB已经把工具箱延伸到了科学研究和工程应用的诸多领域,诸如数据采集、概率统计、信号处理、图像处理和物理仿真等,都在工具箱(T oolbo x)家族中有自己的一席之地。
此外,MATLAB还支持用户用自己编写的M文件(M A TLAB的程序文件)组成自己的工具箱,极大的方便了用户的使用和维护。
本文想就MA TLAB中提供的图像处理工具箱(ImageProcessingT oolbo x)的使用作一些实例方面的介绍。
二、MATLAB数字图像处理MATLAB全称是Ma trixLabora tory(矩阵实验室),一开始它是一种专门用于矩阵数值计算的软件,从这一点上也可以看出,它在矩阵运算上有自己独特的特点。
实际上MATLAB中的绝大多数的运算都是通过矩阵这一形式进行的。
这一特点也就决定了MA TLAB在处理数字图像上的独特优势。
BMP图像的读写(8位和24位)
![BMP图像的读写(8位和24位)](https://img.taocdn.com/s3/m/c9e33f21763231126edb1153.png)
南通大学计算机科学与技术学院《数字图像处理》课程实验报告书实验名BMP文件的读写(8位和24位)班级计121姓名张进学号**********2014年6月16 日一、实验内容1、了解BMP文件的结构2、8位位图和24位位图的读取二、BMP图形文件简介BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。
Windows系统内部各图像绘制操作都是以BMP为基础的。
Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。
Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。
BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件结构内容摘要三、读写涉及的原理1、图像的二值化的基本原理图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。
即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现(彩色图)
![【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现(彩色图)](https://img.taocdn.com/s3/m/a2599dd4ab00b52acfc789eb172ded630b1c98fb.png)
【数字图像处理】C++读取、旋转和保存bmp图像⽂件编程实现(彩⾊图)彩⾊图:彩⾊图的处理和灰度图略有不⼀样。
主要是像素数据不同。
由于每⾏数据的字节数必须是4的整数倍,这个地⽅处理起来要⽐灰度图⿇烦很多,多以暂时还没做好。
本程序的局限性就是只能处理尺⼨是4的整数倍的图⽚,可以旋转任意⾓度(逆时针)。
参考代码:分两个⽂件:BmpRot.h和BmpRot.cppBmpRot.h:BmpRot.cpp:23. cout<<"实际位图数据的偏移字节数:"<<pBmpHead.bfOffBits<<endl<<endl;24. }25.26. void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead){27. cout<<"位图信息头:"<<endl;28. cout<<"结构体的长度:"<<pBmpInforHead.biSize<<endl;29. cout<<"位图宽:"<<pBmpInforHead.biWidth<<endl;30. cout<<"位图⾼:"<<pBmpInforHead.biHeight<<endl;31. cout<<"biPlanes平⾯数:"<<pBmpInforHead.biPlanes<<endl;32. cout<<"biBitCount采⽤颜⾊位数:"<<pBmpInforHead.biBitCount<<endl;33. cout<<"压缩⽅式:"<<pBmpInforHead.biCompression<<endl;34. cout<<"biSizeImage实际位图数据占⽤的字节数:"<<pBmpInforHead.biSizeImage<<endl;35. cout<<"X⽅向分辨率:"<<pBmpInforHead.biXPelsPerMeter<<endl;36. cout<<"Y⽅向分辨率:"<<pBmpInforHead.biYPelsPerMeter<<endl;37. cout<<"使⽤的颜⾊数:"<<pBmpInforHead.biClrUsed<<endl;38. cout<<"重要颜⾊数:"<<pBmpInforHead.biClrImportant<<endl;39. }40.41.42. int main(){43. char strFile[LENGTH_NAME_BMP];//bmp⽂件名44. IMAGEDATA *imagedata = NULL;//动态分配存储原图⽚的像素信息的⼆维数组45. IMAGEDATA *imagedataRot = NULL;//动态分配存储旋转后的图⽚的像素信息的⼆维数组46. int width,height;//图⽚的宽度和⾼度47. cout<<"请输⼊所要读取的⽂件名:"<<endl;48. cin>>strFile;49. FILE *fpi,*fpw;50. fpi=fopen(strFile,"rb");51. if(fpi != NULL){52. //先读取⽂件类型53. WORD bfType;54. fread(&bfType,1,sizeof(WORD),fpi);55. if(0x4d42!=bfType)56. {57. cout<<"the file is not a bmp file!"<<endl;58. return NULL;59. }60. //读取bmp⽂件的⽂件头和信息头61. fread(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpi);62. //showBmpHead(strHead);//显⽰⽂件头63. fread(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpi);64. //showBmpInforHead(strInfo);//显⽰⽂件信息头65.66. //读取调⾊板67. for(unsigned int nCounti=0;nCounti68. {69. //存储的时候,⼀般去掉保留字rgbReserved70. fread((char *)&strPla[nCounti].rgbBlue,1,sizeof(BYTE),fpi);71. fread((char *)&strPla[nCounti].rgbGreen,1,sizeof(BYTE),fpi);72. fread((char *)&strPla[nCounti].rgbRed,1,sizeof(BYTE),fpi);73. cout<<"strPla[nCounti].rgbBlue"<<strPla[nCounti].rgbBlue<<endl;74. cout<<"strPla[nCounti].rgbGreen"<<strPla[nCounti].rgbGreen<<endl;75. cout<<"strPla[nCounti].rgbRed"<<strPla[nCounti].rgbRed<<endl;76. }77.78. width = strInfo.biWidth;79. height = strInfo.biHeight;80. imagedata = (IMAGEDATA*)malloc(width * height * sizeof(IMAGEDATA));81. imagedataRot = (IMAGEDATA*)malloc(2 * width * 2 * height * sizeof(IMAGEDATA));82. //初始化原始图⽚的像素数组83. for(int i = 0;i < height;++i)84. {85. for(int j = 0;j < width;++j)86. {87. (*(imagedata + i * width + j)).blue = 0;88. (*(imagedata + i * width + j)).green = 0;89. (*(imagedata + i * width + j)).red = 0;90. }91. }92. //初始化旋转后图⽚的像素数组93. for(int i = 0;i < 2 * height;++i)94. {95. for(int j = 0;j < 2 * width;++j)96. {97. (*(imagedataRot + i * 2 * width + j)).blue = 0;98. (*(imagedataRot + i * 2 * width + j)).green = 0;99. (*(imagedataRot + i * 2 * width + j)).red = 0;100. }101. }102. //fseek(fpi,54,SEEK_SET);103. //读出图⽚的像素数据104. fread(imagedata,sizeof(struct tagIMAGEDATA) * width,height,fpi);105.106. fclose(fpi);107. }108. else109. {110. cout<<"file open error!"<<endl;111. return NULL;112. }113.114. //图⽚旋转处理114. //图⽚旋转处理115. int RotateAngle;//要旋转的⾓度数116. double angle;//要旋转的弧度数117. int midX_pre,midY_pre,midX_aft,midY_aft;//旋转所围绕的中⼼点的坐标118. midX_pre = width / 2;119. midY_pre = height / 2;120. midX_aft = width;121. midY_aft = height;122. int pre_i,pre_j,after_i,after_j;//旋转前后对应的像素点坐标123. cout<<"输⼊要旋转的⾓度(0度到360度,逆时针旋转):"<<endl;124. cin>>RotateAngle;125. angle = 1.0 * RotateAngle * PI / 180;126. for(int i = 0;i < 2 * height;++i)127. {128. for(int j = 0;j < 2 * width;++j)129. {130. after_i = i - midY_aft;//坐标变换131. after_j = j - midX_aft;132. pre_i = (int)(cos((double)angle) * after_i - sin((double)angle) * after_j) + midY_pre;133. pre_j = (int)(sin((double)angle) * after_i + cos((double)angle) * after_j) + midX_pre;134. if(pre_i >= 0 && pre_i < height && pre_j >= 0 && pre_j < width)//在原图范围内135. *(imagedataRot + i * 2 * width + j) = *(imagedata + pre_i * width + pre_j);136. }137. }138.139. //保存bmp图⽚140. if((fpw=fopen("b.bmp","wb"))==NULL)141. {142. cout<<"create the bmp file error!"<<endl;143. return NULL;144. }145. WORD bfType_w=0x4d42;146. fwrite(&bfType_w,1,sizeof(WORD),fpw);147. //fpw +=2;148. fwrite(&strHead,1,sizeof(tagBITMAPFILEHEADER),fpw);149. strInfo.biWidth = 2 * width;150. strInfo.biHeight = 2 * height;151. fwrite(&strInfo,1,sizeof(tagBITMAPINFOHEADER),fpw);152. //保存调⾊板数据153. for(unsigned int nCounti=0;nCounti154. {155. fwrite(&strPla[nCounti].rgbBlue,1,sizeof(BYTE),fpw);156. fwrite(&strPla[nCounti].rgbGreen,1,sizeof(BYTE),fpw);157. fwrite(&strPla[nCounti].rgbRed,1,sizeof(BYTE),fpw);158. }159. //保存像素数据160. for(int i =0;i < 2 * height;++i)161. {162. for(int j = 0;j < 2 * width;++j)163. {164. fwrite( &(*(imagedataRot + i * 2 * width + j)).red,1,sizeof(BYTE),fpw);//注意三条语句的顺序:否则颜⾊会发⽣变化165. fwrite( &(*(imagedataRot + i * 2 * width + j)).green,1,sizeof(BYTE),fpw);166. fwrite( &(*(imagedataRot + i * 2 * width + j)).blue,1,sizeof(BYTE),fpw);167. }168. }169. fclose(fpw);170.171. //释放内存172. delete[] imagedata;173. delete[] imagedataRot;174. }转⾃CSDN 江南烟⾬博客在此表⽰感谢。
【数字图像处理】一、BMP文件的读写
![【数字图像处理】一、BMP文件的读写](https://img.taocdn.com/s3/m/1dccbf05c381e53a580216fc700abb68a982ade7.png)
一、BMP文件读写1.BMP文件组成BMP文件有文件头、位图信息头、颜色信息和图像数据等四部分组成。
BMP文件头数据包含BMP文件类型、文件大小和位图起始位置等信息。
其结构定义如下:typedef struct tagBITMAPFILEHEADER{WORD bfType;//位图文件的类型,必须为BMPDWORD bfSize;//位图文件的大小,以字节为单位WORD bfReserved1;//位图文件保留字,必须为0WORD bfReserved2;//位图文件保留字,必须为0DWORD bfOffBits;//位图数据的起始位置,以相对于位图文件头的偏移量表示,以//字节单位}BITMAPFILEHEADER;BMP位图信息头数据用于说明位图的尺寸等信息。
其结构定义如下:typedef struct tagBITMAPINFOHEADER{DWORD biSize;//本结构所占用字节数LONG biWidth;//位图的宽度,以像素为单位LONG biHeight;//位图的高度,以像素为单位WORD biplanes;//目标设备的级别,必须为1WORD biBitCount;//每个像素所需要的位数,必须为1(双色),4(16色),8(256//色)或24(真彩色)之一DWORD biCompression;//位图压缩类型,必须为0(不压缩),1(BI_RLE8压缩类//型)或2(BI_RLE4压缩类型)之一DWORD biSizeIMage;//位图的大小,以字节为单位LONG biXPelsPerMeter;//位图水平分辨率,每米像素数LONG biXPelsPerMeter;// 位图垂直分辨率,每米像素数DWORD biClrUsed;//位图实际使用的颜色表中的颜色数DWORD biClrImportant;//位图显示过程中重要的颜色数}BITMAPINFOHEADER颜色表用于说明位图中的颜色,它有若干个表项,每一表项是一个RGBQUAR类型的结构,定义一种颜色。
2.MFC-bmp图片读取保存
![2.MFC-bmp图片读取保存](https://img.taocdn.com/s3/m/e7feea09f12d2af90242e60d.png)
第二课 bmp图片格式解析<一>.BMP格式定义BMP文件格式是Windows操作系统推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,故称位图(bitmap),其扩展名为BMP。
BMP图像文件被分为4个部分:a.位图文件头b.位图信息头c.颜色表d.位图数据a.颜色表中RGBQUAD结构数据的个数有biBitCount来确定:当biBitCount=1,4,8时,分别有2,16,256个表项;当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:typedef struct tagBITMAPINFO {BITMAPINFOHEADER bmiHeader; // 位图信息头RGBQUAD bmiColors[1]; // 颜色表} BITMAPINFO;b.位图数据位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。
位图的一个像素值所占的字节数: 当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节;Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31)/ 8) * bi.biHeight。
<二>.BMP图片在MFC工程中的定义存在2个未解问题:a. bmp结构时我定义成系统自带的结构,否则会多2个字节在图片最后为CD;b. 在read中malloc只能申请4字节的空间,但fread(,m_nImage,)读入位图大小个。
第一步:添加BMP信息文件头文件—新建—创建ImageStruct.h—包含BMP格式的文件头部分的结构。
数字图像处理-Python读取BMP文件
![数字图像处理-Python读取BMP文件](https://img.taocdn.com/s3/m/8fe9c01317fc700abb68a98271fe910ef12daeb4.png)
数字图像处理-Python读取BMP⽂件import numpy as npimport structfrom PIL import Imageclass ImageFile():def getBMP(self, filepath):# 先将位图打开f = open(filepath,'rb') # 打开对应的⽂件# 下⾯部分⽤来读取BMP位图的基础信息f_type = str(f.read(2)) # 这个就可以⽤来读取⽂件类型需要读取2个字节file_size_byte = f.read(4) # 这个可以⽤来读取⽂件的⼤⼩需要读取4个字节f.seek(f.tell()+4) # 跳过中间⽆⽤的四个字节file_ofset_byte = f.read(4) # 读取位图数据的偏移量f.seek(f.tell()+4) # 跳过⽆⽤的两个字节file_wide_byte = f.read(4) # 读取宽度字节file_height_byte = f.read(4) # 读取⾼度字节f.seek(f.tell()+2) # 跳过中间⽆⽤的两个字节file_bitcount_byte = f.read(4) # 得到每个像素占位⼤⼩#下⾯就是将读取的字节转换成指定的类型f_size, = struct.unpack('i', file_size_byte)f_ofset, = struct.unpack('i', file_ofset_byte)f_wide, = struct.unpack('i', file_wide_byte)f_height, = struct.unpack('i', file_height_byte)f_bitcount, = struct.unpack('i', file_bitcount_byte)print("类型:", f_type, "⼤⼩:", f_size, "位图数据偏移量:", f_ofset, "宽度:", f_wide, "⾼度:", f_height, "位图:", f_bitcount)# 然后来读取颜⾊表color_table = np.empty(shape=[256, 4], dtype=int)f.seek(54) #跳过⽂件信息头和位图信息头for i in range(0, 256):b=struct.unpack('B', f.read(1))[0]g = struct.unpack('B', f.read(1))[0]r = struct.unpack('B', f.read(1))[0]alpha = struct.unpack('B', f.read(1))[0]color_table[i][0] = rcolor_table[i][1] = gcolor_table[i][2] = bcolor_table[i][3] = 255# 下⾯部分⽤来读取BMP位图数据区域,将数据存⼊numpy数组# ⾸先对⽂件指针进⾏偏移f.seek(f_ofset)# 因为图像是8位伪彩⾊图像,所以⼀个像素点占⼀个字节,即8位img = np.empty(shape=[f_height, f_wide, 4], dtype=int)cout = 0"""然后就是来读取位图数据了,读取位图数据的时候,我们⼀定要注意,数据的排列⽅式是从左到右,从下到上!还有⼀个while循环,是⽤来判断⾏像素是否为4的倍数,如果不是我们还要将填充的⽤字节给读取扔掉"""for y in range(0, f_height):for x in range(0,f_wide):cout = cout + 1index = struct.unpack('B', f.read(1))[0]img[f_height - y - 1, x] = color_table[index]while cout % 4 != 0:f.read(1)cout = cout+1f.close()return imgdef ndarry2image(self, ndarry):# ndarray 转图⽚ndarry = ndarry.astype("uint8")# ndarry = cv2.cvtColor(ndarry, cv2.COLOR_BGR2RGB)ndarry = Image.fromarray(ndarry)ndarry = ndarry.toqpixmap()return ndarry。
opencv bmp标准格式
![opencv bmp标准格式](https://img.taocdn.com/s3/m/c8e5f3fcfc0a79563c1ec5da50e2524de518d03c.png)
opencv bmp标准格式图像处理是计算机视觉领域的重要分支,在计算机图形学和机器视觉中起着至关重要的作用。
而OpenCV作为一个开源的图像处理库,提供了许多功能强大的工具和算法,其中包括对BMP标准格式图像的处理和操作。
本文将介绍OpenCV中关于BMP标准格式的相关知识和使用方法。
1、BMP标准格式简介BMP(Bitmap)是Windows操作系统中使用的一种常见的图像文件格式。
它以二进制形式存储,并使用HEADER(文件头)、INFOHEADER(信息头)和位图数据等部分组成。
HEADER包含了文件类型、大小和像素数据的偏移量等信息,而INFOHEADER则包括了图像的宽度、高度和位深等信息。
OpenCV可以读取和保存这种标准格式的BMP图像,并提供了丰富的函数库进行图像处理。
2、使用OpenCV读取BMP图像使用OpenCV读取BMP图像非常简单,可以使用imread函数来实现。
imread函数接受图像文件的路径作为参数,并返回一个Mat对象,该对象包含了图像的像素数据和其他相关信息。
下面是一个示例代码:```cpp#include <opencv2/opencv.hpp>using namespace cv;int main() {// 读取BMP格式图像Mat image = imread("test.bmp", IMREAD_COLOR);// 检查图像是否成功读取if (image.empty()) {printf("无法读取图像文件!\n");return -1;}// 显示图像namedWindow("BMP Image", WINDOW_NORMAL);imshow("BMP Image", image);waitKey(0);return 0;}```在这个示例中,我们首先使用imread函数加载一个名为"test.bmp"的BMP图像文件,并将返回结果存储在Mat对象中。
BMP文件格式
![BMP文件格式](https://img.taocdn.com/s3/m/02d469d35022aaea998f0f76.png)
I
BMP 文件格式
1 格式组成
典型的 BMP 图像文件由四部分组成: 1:位图头文件数据结构,它包含 BMP 图像文件的类型、显示内容等信息; 2:位图信息数据结构,它包含有 BMP 图像的宽、高、压缩方法,以及定义 颜色等信息; 3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真 彩色图(24 位的 BMP)就不需要调色板; 4:位图数据,这部分的内容根据 BMP 位图使用的位数不同而不同,在 24 位图中直接使用 RGB,而其他的小于 24 位的使用调色板中颜色索引值。
2 格式类型
位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。 DDB 位图在早期的 Windows 系统(Windows 3.0 以前)中是很普遍的,事实上它 也是唯一的。然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB 位图的一些固有的问题开始浮现出来了。比如,它不能够存储(或者说获取)创 建这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显 示设备是否适合显示这张图片。为了解决这一难题,微软创建了 DIB 位图格式。
3 对应数据结构 ..................................................................................................... 3 4 读取方法 ............................................................................................................ 5 5 文件部分 ............................................................................................................ 6
野火stm32-LCD显示(中英文、BMP图片,带截图功能)
![野火stm32-LCD显示(中英文、BMP图片,带截图功能)](https://img.taocdn.com/s3/m/eb8c47601ed9ad51f01df2c4.png)
SD卡字库和 bmp图片显示实验E-Mail firestm32@QQ 313303034博客硬件平台野火STM32开发板库版本ST3.0.0实验描述:使用软件制作自定义类型的字库,然之后将字库放入SD卡中,并且在SD 卡中放入一张bmp图片作为LCD背景。
并且调用截屏函数截取LCD背景并保存为bmp图片。
硬件连接:MicroSD卡PC8-SDIO-D0 ----DATA0PC9-SDIO-D1 ----DATA1PC10-SDIO-D2 ----DATA2PC11-SDIO-D3 ----CD/DATA3PC12-SDIO-CLK ----CLKPD2-SDIO-CMD ----CMDTFT 数据线PD14-FSMC-D0 ----LCD-DB0PD15-FSMC-D1 ----LCD-DB1PD0-FSMC-D2 ----LCD-DB2PD1-FSMC-D3 ----LCD-DB3PE7-FSMC-D4 ----LCD-DB4PE8-FSMC-D5 ----LCD-DB5PE9-FSMC-D6 ----LCD-DB6PE10-FSMC-D7 ----LCD-DB7PE11-FSMC-D8 ----LCD-DB8PE12-FSMC-D9 ----LCD-DB9PE13-FSMC-D10 ----LCD-DB10PE14-FSMC-D11 ----LCD-DB11PE15-FSMC-D12 ----LCD-DB12PD8-FSMC-D13 ----LCD-DB13PD9-FSMC-D14 ----LCD-DB14PD10-FSMC-D15 ----LCD-DB15 TFT 控制信号线PD4-FSMC-NOE ----LCD-RDPD5-FSMC-NEW ----LCD-WRPD7-FSMC-NE1 ----LCD-CSPD11-FSMC-A16 ----LCD-DCPE1-FSMC-NBL1 ----LCD-RESETPD13-FSMC-A18 ----LCD-BLACK-LIGHT库文件:startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_rcc.cFWlib/misc.cFwlib/stm32f10x_systick.cFWlib/stm32f10x_exti.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_dma.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_fsmc.c用户文件: USER/main.cUSER/stm32f10x_it.cUSER/systick.cUSER/usart1.cUSER/lcd.cUSER/ff.cUSER/sdcard.cUSER/diskio.cUSER/sd_fs_app.cUSER/Sd_bmp.c野火STM32开发板LCD和SD卡硬件连接图:SD卡接口连接如下LCD接口连接如下字库制作详细流程我们采用“字模III-增强版v3.91”软件来制作中文字库。
c++读取BMP文件(24位)
![c++读取BMP文件(24位)](https://img.taocdn.com/s3/m/f48b56283169a4517723a3dd.png)
char fname_bmp[128]; sprintf(fname_bmp, "%s.bmp", filename);
FILE *fp; if (!(fp = fopen(fname_bmp, "wb")))
return -1;
fwrite(header, sizeof(unsigned char), 54, fp);
****************************************************************************/ int youwritetobmp(RGBQUAD *pixarr, int xsize, int ysize, char *filename){
fclose(fp); return 0; }
void clonebmp(unsigned char *image,int xsize,int ysize) {
bmp_read(image, xsize, ysize, ".\\1"); bmp_write(image, xsize, ysize, ".\\2"); }
if (image == NULL) return -1;
clonebmp(image,xsize,ysize);
//功能一:实现一副图像的拷贝
//youwritetobmp(pixarray,xsize,ysize,"yourimage");//功能二:实现像素的精确绘制,像素值 在 pixarray 数组中
unsigned char header[54] ={ 0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
无格式文档
![无格式文档](https://img.taocdn.com/s3/m/270237d084254b35eefd3408.png)
引言脆弱数字水印(Digital Watermarking)是多媒体数据(如图像、声音、视频信号等)中添加某些数字信息(水印)而不影响原数据的视听效果(此处我们只讨论人们普遍关心的不可见水印),并且这些数字信息可以部分或全部从混合数据中恢复出来,以达到版权保护等作用。
一般地,数字水印应具有如下的特性:安全性(嵌入在宿主数据中的水印是不可删除的,且能够提供完全的版权证据)、鲁棒性(水印对有意或无意的图像操作与失真具有一定的抵抗力)以及不可觉察性(水印对人的感觉器官应是不可觉察的,或者说是透明的)、保真性(加入水印后,并不会损害原来的媒体内容价值)。
基础知识密码学和信息隐藏密码学包括信息的保密传输和身份(时间等)的不可抵赖等,密码学在古代就有较为原始的应用. 如何加密和解密信息大体上分为两种方式:对称密码和非对称密码。
非对称密码的实现是通过大素数的数论原理来实现的。
随着Internet的普及,尤其是电子商务的普及,密码学在internet上得到了充分的应用。
这是由于交易的双方在internet上的沟通不是面对面的,而且数据传输过程中信息泄密点很多,因此加密技术可以应用在信息的加密传输以及身份(时间)验证上。
在电子商务使用最多的Https协议,使用的是SSL通道,其中使用非对称加密来加密对称加密的密钥,利用对称加密来实现信息的沟通。
最后要说明的是,在当前的理论体系下,人们可以设计出几乎无法破解的系统。
但是随着计算机能力的提高和新的数学方法的发现,以前认为较为可靠的加密算法已经可以较为容易的破解了。
图像脆弱数字水印脆弱数字水印(Digital Watermarking)是多媒体数据(如图像、声音、视频信号等)中添加某些数字信息(水印)而不影响原数据的视听效果(此处我们只讨论人们普遍关心的不可见水印),并且这些数字信息可以部分或全部从混合数据中恢复出来,以达到版权保护等作用。
一般地,数字水印应具有如下的特性:安全性(嵌入在宿主数据中的水印是不可删除的,且能够提供完全的版权证据)、鲁棒性(水印对有意或无意的图像操作与失真具有一定的抵抗力)以及不可觉察性(水印对人的感觉器官应是不可觉察的,或者说是透明的)、保真性(加入水印后,并不会损害原来的媒体内容价值)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。
<?xml:namespace prefix = o ns ="urn:schemas-microsoft-com:office:office" />位图文件主要分为如下3个部分:1、文件信息头BITMAPFILEHEADER结构体定义如下:typedef struct tagBITMAPFILEHEADER {WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER;其中:2、位图信息头BITMAPINFOHEADER结构体定义如下:typedef struct tagBITMAPINFOHEADER {DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER;其中:BMP头文件格式以及C语言读取头文件(二)具体数据举例:如某BMP文件开头:424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
一、图像文件头1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。
424Dh=’BM’,表示是Windows支持的BMP格式。
2)2-3:整个文件大小。
4690 0000,为00009046h=36934。
3)4-5:保留,必须设置为0。
4)6-7:从文件开始到位图数据之间的偏移量。
4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。
8000 0000,为00000080h=128。
7)12-13:位图高度,以像素为单位。
9000 0000,为00000090h=144。
8)14:位图的位面数,该值总是1。
0100,为0001h=1。
二、位图信息头9)15:每个像素的位数。
有1(单色),4(16色),8(256色),16(64K 色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。
1000为0010h=16。
10)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。
RLE简单地说是采用像素数+像素值的方式进行压缩。
T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。
图中0300 0000为00000003h=3。
11)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。
0090 0000为00009000h=80×90×2h=36864。
12)20-21:用象素/米表示的水平分辨率。
A00F 0000为0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。
A00F 0000为0000 0FA0h=4000。
14)24-25:位图使用的颜色索引数。
设为0的话,则说明使用所有调色板项。
15)26-27:对图象显示有重要影响的颜色索引的数目。
如果是0,表示都重要。
具体代码C语言执行:(D 盘中有文件名为1的bmp图像)#include <stdio.h>#include <stdlib.h>typedef struct tagBITMAPFILEHEADER{unsigned short int bfType; //位图文件的类型,必须为BM unsigned long bfSize; //文件大小,以字节为单位unsigned short int bfReserverd1; //位图文件保留字,必须为0 unsigned short int bfReserverd2; //位图文件保留字,必须为0 unsigned long bfbfOffBits; //位图文件头到数据的偏移量,以字节为单位}BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{long biSize; //该结构大小,字节为单位long biWidth; //图形宽度以象素为单位long biHeight; //图形高度以象素为单位short int biPlanes; //目标设备的级别,必须为1short int biBitcount; //颜色深度,每个象素所需要的位数short int biCompression; //位图的压缩类型long biSizeImage; //位图的大小,以字节为单位long biXPelsPermeter; //位图水平分辨率,每米像素数long biYPelsPermeter; //位图垂直分辨率,每米像素数long biClrUsed; //位图实际使用的颜色表中的颜色数long biClrImportant; //位图显示过程中重要的颜色数}BITMAPINFOHEADER;typedef struct{BITMAPFILEHEADER file; //文件信息区BITMAPINFOHEADER info; //图象信息区}bmp;bmp readbmpfile(void); //函数声明int main(void){bmp m; //定义一个结构变量m=readbmpfile(); //读取一个位图getchar();return 0;}bmp readbmpfile(void){ bmp m; //定义一个位图结构FILE *fp;if((fp=fopen( "d:\\1.bmp", "r"))==NULL){ printf( "can't open the bmp imgae.\n ");exit(0);}else{fread(&m.file.bfType,sizeof(char),1,fp);printf("类型为%c",m.file.bfType);fread(&m.file.bfType,sizeof(char),1,fp);printf("%c\n",m.file.bfType);fread(&m.file.bfSize,sizeof(long),1,fp);printf("文件长度为%d\n",m.file.bfSize);fread(&m.file.bfReserverd1,sizeof(short int),1,fp); printf("保留字1为%d\n",m.file.bfReserverd1);fread(&m.file.bfReserverd2,sizeof(short int),1,fp); printf("保留字2为%d\n",m.file.bfReserverd2);fread(&m.file.bfbfOffBits,sizeof(long),1,fp);printf("偏移量为%d\n",m.file.bfbfOffBits);fread(&.biSize,sizeof(long),1,fp);printf("此结构大小为%d\n",.biSize);fread(&.biWidth,sizeof(long),1,fp);printf("位图的宽度为%d\n",.biWidth);fread(&.biHeight,sizeof(long),1,fp);printf("位图的高度为%d\n",.biHeight);fread(&.biPlanes,sizeof(short),1,fp);printf("目标设备位图数%d\n",.biPlanes);fread(&.biBitcount,sizeof(short),1,fp);printf("颜色深度为%d\n",.biBitcount);fread(&.biCompression,sizeof(long),1,fp); printf("位图压缩类型%d\n",.biCompression); fread(&.biSizeImage,sizeof(long),1,fp);printf("位图大小%d\n",.biSizeImage);fread(&.biXPelsPermeter,sizeof(long),1,fp);printf("位图水平分辨率为%d\n",.biXPelsPermeter);fread(&.biYPelsPermeter,sizeof(long),1,fp);printf("位图垂直分辨率为%d\n",.biYPelsPermeter);fread(&.biClrUsed,sizeof(long),1,fp);printf("位图实际使用颜色数%d\n",.biClrUsed);fread(&.biClrImportant,sizeof(long),1,fp);printf("位图显示中比较重要颜色数%d\n",.biClrImportant); }return m;}结果执行如下:的位图数据、宽、高、颜色表及每像素* 位数等数据进内存,存放在相应的全局变量中***********************************************************************/bool readBmp(char *bmpName){//二进制读方式打开指定的图像文件FILE *fp=fopen(bmpName,"rb");if(fp==0) return 0;//跳过位图文件头结构BITMAPFILEHEADERfseek(fp, sizeof(BITMAPFILEHEADER),0);//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中BITMAPINFOHEADER head;fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);//获取图像宽、高、每像素所占位数等信息bmpWidth = head.biWidth;bmpHeight = head.biHeight;biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256if(biBitCount==8){//申请颜色表所需要的空间,读颜色表进内存pColorTable=new RGBQUAD[256];fread(pColorTable,sizeof(RGBQUAD),256,fp);}//申请位图数据所需要的空间,读位图数据进内存pBmpBuf=new unsigned char[lineByte * bmpHeight];fread(pBmpBuf,1,lineByte * bmpHeight,fp);//关闭文件fclose(fp);return 1;}2.BMP文件的存盘给定图像路径名以及图像的数据,对图像的写操作也是按照BMP文件4个组成部分进行分别处理的。