1.首先需要我们定义一下BMP的数据结构,需要定义几个结构体类型:分别为:BITMAPINFOHEADER(BMP的信息头)、BITMAPFILEHEADER(BMP文件的信息头)、RGBQUAD(彩色表,存放RGB565编码)以及BITMAPINFO(综合上面的三个结构体)。

2.设置位图信息,并写入SD卡。

注意非常重要的一点是,如果OV7725输出为RGB565格式,一定要配置压缩类型为3,同时需要配置彩色表,如下所示:

3.逐像素地写入数据到位图文件中。

最后,为了大家参考方便,奉上源代码。

bmp.h

#ifndef __BMP_H__
#define __BMP_H__
#include "sys.h"
//   //********************************************************************************
//升级说明
//V2.0
//1,将jpeg解码库换成了TJPGD,支持更多的jpg/jpeg文件,支持小尺寸图片快速jpeg显示
//2,pic_phy里面新增3个函数,用于开窗显示,以提高小尺寸jpg图片的显示速度
//3,ai_load_picfile函数,新增一个参数:fast,用于设置是否使能jpeg/jpg快速显示
//注意:这里的小尺寸是指:jpg/jpeg图片尺寸小于等于LCD尺寸.
////用户配置区///
#define BMP_USE_MALLOC      1       //定义是否使用malloc,这里我们选择使用malloc
#define BMP_DBUF_SIZE       2048    //定义bmp解码数组的大小(最少应为LCD宽度*3)
//END///BMP信息头
typedef __packed struct
{u32 biSize ;           //说明BITMAPINFOHEADER结构所需要的字数。long  biWidth ;            //说明图象的宽度,以象素为单位 long  biHeight ;        //说明图象的高度,以象素为单位 u16  biPlanes ;         //为目标设备说明位面数,其值将总是被设为1 u16  biBitCount ;     //说明比特数/象素,其值为1、4、8、16、24、或32u32 biCompression ;     //说明图象数据压缩的类型。其值可以是下述值之一://BI_RGB:没有压缩;//BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);  //BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成//BI_BITFIELDS:每个象素的比特由指定的掩码决定。u32 biSizeImage ;      //说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0  long  biXPelsPerMeter ;   //说明水平分辨率,用象素/米表示long  biYPelsPerMeter ; //说明垂直分辨率,用象素/米表示u32 biClrUsed ;         //说明位图实际使用的彩色表中的颜色索引数u32 biClrImportant ;   //说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
}BITMAPINFOHEADER ;
//BMP头文件
typedef __packed struct
{u16  bfType ;     //文件标志.只对'BM',用来识别BMP位图类型u32  bfSize ;   //文件大小,占四个字节u16  bfReserved1 ;//保留u16  bfReserved2 ;//保留u32  bfOffBits ;  //从文件开始到位图数据(bitmap data)开始之间的的偏移量
}BITMAPFILEHEADER ;
//彩色表
typedef __packed struct
{u8 rgbBlue ;    //指定蓝色强度u8 rgbGreen ;  //指定绿色强度 u8 rgbRed ;        //指定红色强度 u8 rgbReserved ;//保留,设置为0
}RGBQUAD ;
//位图信息头
typedef __packed struct
{ BITMAPFILEHEADER bmfHeader;BITMAPINFOHEADER bmiHeader;  u32 RGB_MASK[3];          //调色板用于存放RGB掩码.//RGBQUAD bmiColors[256];
}BITMAPINFO;
typedef RGBQUAD * LPRGBQUAD;//彩色表  //图象数据压缩的类型
#define BI_RGB          0  //没有压缩.RGB 5,5,5.
#define BI_RLE8         1  //每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);
#define BI_RLE4         2  //每个象素4比特的RLE压缩编码,压缩格式由2字节组成
#define BI_BITFIELDS    3  //每个象素的比特由指定的掩码决定。 (存储为RGB565格式位图时需要设置压缩类型为3) ///
//BMP编解码函数
u8 stdbmp_decode(const u8 *filename);
u8 minibmp_decode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u16 acolor,u8 mode);//尺寸小于240*320的bmp图片解码.
///
#endif

bmp.c

#include "piclib.h"
#include "bmp.h"
#include "string.h"//********************************************************************************
//升级说明
//V2.0
//1,将jpeg解码库换成了TJPGD,支持更多的jpg/jpeg文件,支持小尺寸图片快速jpeg显示
//2,pic_phy里面新增3个函数,用于开窗显示,以提高小尺寸jpg图片的显示速度
//3,ai_load_picfile函数,新增一个参数:fast,用于设置是否使能jpeg/jpg快速显示
//注意:这里的小尺寸是指:jpg/jpeg图片尺寸小于等于LCD尺寸.
////不使用内存分配
#if BMP_USE_MALLOC == 0
FIL f_bfile;
u8 bmpreadbuf[BMP_DBUF_SIZE];
#endif                  //标准的bmp解码,解码filename这个BMP文件
//速度比较慢.主要
//filename:包含路径的文件名
//返回值:0,成功;
//       其他,错误码.
u8 stdbmp_decode(const u8 *filename)
{FIL* f_bmp;u16 br;u16 count;                  u8  rgb ,color_byte;u16 x ,y,color;    u16 countpix=0;//记录像素     //x,y的实际坐标 u16  realx=0;u16 realy=0;u8  yok=1;                     u8 res;u8 *databuf;          //数据读取存放地址u16 readlen=BMP_DBUF_SIZE;//一次从SD卡读取的字节数长度u8 *bmpbuf;                //数据解码地址u8 biCompression=0;        //记录压缩方式u16 rowlen;             //水平方向字节数  BITMAPINFO *pbmp;        //临时指针#if BMP_USE_MALLOC == 1 //使用malloc  databuf=(u8*)mymalloc(SRAMIN,readlen);     //开辟readlen字节的内存区域if(databuf==NULL)return PIC_MEM_ERR;    //内存申请失败.f_bmp=(FIL *)mymalloc(SRAMIN,sizeof(FIL));    //开辟FIL字节的内存区域 if(f_bmp==NULL)                            //内存申请失败.{       myfree(SRAMIN,databuf);return PIC_MEM_ERR;             }
#else                   //不使用mallocdatabuf=bmpreadbuf;f_bmp=&f_bfile;
#endifres=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//打开文件                            if(res==0)//打开成功.{ f_read(f_bmp,databuf,readlen,(UINT*)&br);    //读出readlen个字节  pbmp=(BITMAPINFO*)databuf;                 //得到BMP的头部信息   count=pbmp->bmfHeader.bfOffBits;         //数据偏移,得到数据段的开始地址color_byte=pbmp->bmiHeader.biBitCount/8;   //彩色位 16/24/32  biCompression=pbmp->bmiHeader.biCompression;//压缩方式picinfo.ImgHeight=pbmp->bmiHeader.biHeight;   //得到图片高度picinfo.ImgWidth=pbmp->bmiHeader.biWidth;   //得到图片宽度 ai_draw_init();//初始化智能画图           //水平像素必须是4的倍数!!if((picinfo.ImgWidth*color_byte)%4)rowlen=((picinfo.ImgWidth*color_byte)/4+1)*4;else rowlen=picinfo.ImgWidth*color_byte;//开始解码BMP   color=0;//颜色清空                                                        x=0 ;y=picinfo.ImgHeight;rgb=0;      //对于尺寸小于等于设定尺寸的图片,进行快速解码realy=(y*picinfo.Div_Fac)>>13;bmpbuf=databuf;while(1){              while(count<readlen)  //读取一簇1024扇区 (SectorsPerClust 每簇扇区数){if(color_byte==3)   //24位颜色图{switch (rgb) {case 0:               color=bmpbuf[count]>>3; //Bbreak ;    case 1:   color+=((u16)bmpbuf[count]<<3)&0X07E0;//Gbreak;      case 2 : color+=((u16)bmpbuf[count]<<8)&0XF800;//R      break ;           }   }else if(color_byte==2)  //16位颜色图{switch(rgb){case 0 : if(biCompression==BI_RGB)//RGB:5,5,5{color=((u16)bmpbuf[count]&0X1F);       //Rcolor+=(((u16)bmpbuf[count])&0XE0)<<1; //G}else      //RGB:5,6,5{color=bmpbuf[count];           //G,B}  break ;   case 1 :                       if(biCompression==BI_RGB)//RGB:5,5,5{color+=(u16)bmpbuf[count]<<9;  //R,G}else       //RGB:5,6,5{color+=(u16)bmpbuf[count]<<8;   //R,G}                                       break ;     }           }else if(color_byte==4)//32位颜色图{switch (rgb){case 0:               color=bmpbuf[count]>>3; //Bbreak ;    case 1:   color+=((u16)bmpbuf[count]<<3)&0X07E0;//Gbreak;      case 2 : color+=((u16)bmpbuf[count]<<8)&0XF800;//R      break ;           case 3 ://alphabend=bmpbuf[count];//不读取  ALPHA通道break ;             }  }else if(color_byte==1)//8位色,暂时不支持,需要用到颜色表.{} rgb++;      count++ ;         if(rgb==color_byte) //水平方向读取到1像素数数据后显示{ if(x<picinfo.ImgWidth)                                      {    realx=(x*picinfo.Div_Fac)>>13;//x轴实际值if(is_element_ok(realx,realy,1)&&yok)//符合条件{                                                       pic_phy.draw_point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF-1,color);//显示图片   //POINT_COLOR=color;        //LCD_DrawPoint(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF); //SRAMLCD.Draw_Point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF,color);}                                        }x++;//x轴增加一个像素 color=0x00; rgb=0;            }countpix++;//像素累加if(countpix>=rowlen)//水平方向像素值到了.换行{        y--; if(y==0)break;           realy=(y*picinfo.Div_Fac)>>13;//实际y值改变   if(is_element_ok(realx,realy,0))yok=1;//此处不改变picinfo.staticx,y的值   else yok=0; x=0; countpix=0;color=0x00;rgb=0;}     }      res=f_read(f_bmp,databuf,readlen,(UINT *)&br);//读出readlen个字节if(br!=readlen)readlen=br;   //最后一批数据          if(res||br==0)break;        //读取出错bmpbuf=databuf;count=0;}  f_close(f_bmp);//关闭文件}
#if BMP_USE_MALLOC == 1   //使用malloc  myfree(SRAMIN,databuf);  myfree(SRAMIN,f_bmp);
#endif  return res;     //BMP显示结束.
}
//小尺寸的bmp解码,解码filename这个BMP文件
//filename:包含路径的文件名
//x,y,width,height:开窗大小
//acolor:附加的alphablend的颜色(这个仅对32位色bmp有效!!!)
//mode:模式(除了bit5,其他的均只对32位色bmp有效!!!)
//     bit[7:6]:0,仅使用图片本身和底色alphablend;
//              1,仅图片和acolor进行alphablend,并且不适用附加的透明度;
//              2,底色,acolor,图片,一起进行alphablend;
//     bit5:保留
//     bit4~0:0~31,使用附加alphablend的透明程度
//返回值:0,成功;
//    其他,错误码.
u8 minibmp_decode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u16 acolor,u8 mode)//尺寸小于240*320的bmp图片解码.
{FIL* f_bmp;u16 br;u8  color_byte;u16 tx,ty,color;   //tx,ty的实际坐标   u8 res;u16 i,j;u8 *databuf;         //数据读取存                                                                       放地址u16 readlen=BMP_DBUF_SIZE;//一次从SD卡读取的字节数长度,不能小于LCD宽度*3!!!u8 *bmpbuf;              //数据解码地址u8 biCompression=0;        //记录压缩方式u16 rowcnt;             //一次读取的行数u16 rowlen;                //水平方向字节数  u16 rowpix=0;           //水平方向像素数     u8 rowadd;                //每行填充字节数u16 tmp_color;u8 alphabend=0xff;      //代表透明色为0,完全不透明u8 alphamode=mode>>6;  //得到模式值,0/1/2BITMAPINFO *pbmp;      //临时指针       //得到窗体尺寸picinfo.S_Height=height;picinfo.S_Width=width;#if BMP_USE_MALLOC == 1  //使用malloc  databuf=(u8*)mymalloc(SRAMIN,readlen);     //开辟readlen字节的内存区域if(databuf==NULL)return PIC_MEM_ERR;        //内存申请失败.f_bmp=(FIL *)mymalloc(SRAMIN,sizeof(FIL));    //开辟FIL字节的内存区域 if(f_bmp==NULL)                                //内存申请失败.{       myfree(SRAMIN,databuf);return PIC_MEM_ERR;             }
#elsedatabuf=bmpreadbuf;f_bmp=&f_bfile;
#endifres=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//打开文件                            if(res==0)//打开成功.{ f_read(f_bmp,databuf,sizeof(BITMAPINFO),(UINT*)&br);//读出BITMAPINFO信息 pbmp=(BITMAPINFO*)databuf;                 //得到BMP的头部信息   color_byte=pbmp->bmiHeader.biBitCount/8; //彩色位 16/24/32  biCompression=pbmp->bmiHeader.biCompression;//压缩方式picinfo.ImgHeight=pbmp->bmiHeader.biHeight;   //得到图片高度picinfo.ImgWidth=pbmp->bmiHeader.biWidth;   //得到图片宽度   //水平像素必须是4的倍数!!if((picinfo.ImgWidth*color_byte)%4)rowlen=((picinfo.ImgWidth*color_byte)/4+1)*4;else rowlen=picinfo.ImgWidth*color_byte;rowadd=rowlen-picinfo.ImgWidth*color_byte;    //每行填充字节数//开始解码BMP   color=0;//颜色清空                                                         tx=0 ;ty=picinfo.ImgHeight-1;if(picinfo.ImgWidth<=picinfo.S_Width&&picinfo.ImgHeight<=picinfo.S_Height){                                rowcnt=readlen/rowlen;                      //一次读取的行数readlen=rowcnt*rowlen;                        //一次读取的字节数rowpix=picinfo.ImgWidth;                 //水平像素数就是宽度 f_lseek(f_bmp,pbmp->bmfHeader.bfOffBits);    //偏移到数据起始位置       while(1){      res=f_read(f_bmp,databuf,readlen,(UINT *)&br);    //读出readlen个字节bmpbuf=databuf;                                  //数据首地址  if(br!=readlen)rowcnt=br/rowlen;             //最后剩下的行数if(color_byte==3)            //24位BMP图片{for(j=0;j<rowcnt;j++)  //每次读到的行数{for(i=0;i<rowpix;i++)//写一行像素{color=(*bmpbuf++)>>3;                 //Bcolor+=((u16)(*bmpbuf++)<<3)&0X07E0;   //Gcolor+=(((u16)*bmpbuf++)<<8)&0XF800;   //Rpic_phy.draw_point(x+tx,y+ty,color);//显示图片 tx++;}bmpbuf+=rowadd;//跳过填充区tx=0;ty--;}}else if(color_byte==2)//16位BMP图片{for(j=0;j<rowcnt;j++)//每次读到的行数{if(biCompression==BI_RGB)//RGB:5,5,5{for(i=0;i<rowpix;i++){color=((u16)*bmpbuf&0X1F);         //Rcolor+=(((u16)*bmpbuf++)&0XE0)<<1;     //Gcolor+=((u16)*bmpbuf++)<<9;        //R,G    pic_phy.draw_point(x+tx,y+ty,color);//显示图片   tx++;}}else  //RGB 565{for(i=0;i<rowpix;i++){                                            color=*bmpbuf++;            //G,Bcolor+=((u16)*bmpbuf++)<<8;  //R,G    pic_phy.draw_point(x+tx,y+ty,color);//显示图片   tx++;}}bmpbuf+=rowadd;//跳过填充区tx=0;ty--;}   }else if(color_byte==4)       //32位BMP图片{for(j=0;j<rowcnt;j++)  //每次读到的行数{for(i=0;i<rowpix;i++){color=(*bmpbuf++)>>3;                    //Bcolor+=((u16)(*bmpbuf++)<<3)&0X07E0;   //Gcolor+=(((u16)*bmpbuf++)<<8)&0XF800;   //Ralphabend=*bmpbuf++;                  //ALPHA通道if(alphamode!=1) //需要读取底色{tmp_color=pic_phy.read_point(x+tx,y+ty);//读取颜色          if(alphamode==2)//需要附加的alphablend{tmp_color=piclib_alpha_blend(tmp_color,acolor,mode&0X1F);   //与指定颜色进行blend       }color=piclib_alpha_blend(tmp_color,color,alphabend/8);           //和底色进行alphablend}else tmp_color=piclib_alpha_blend(acolor,color,alphabend/8);     //与指定颜色进行blendpic_phy.draw_point(x+tx,y+ty,color);//显示图片                 tx++;//x轴增加一个像素      }bmpbuf+=rowadd;//跳过填充区tx=0;ty--;}}if(br!=readlen||res)break;  }   }  f_close(f_bmp);//关闭文件      }else res=PIC_SIZE_ERR;//图片尺寸错误
#if BMP_USE_MALLOC == 1   //使用malloc  myfree(SRAMIN,databuf);  myfree(SRAMIN,f_bmp);
#endif  return res;
}            

main.c

#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "piclib.h"
#include "ov7725.h"
#include "key.h"
#include "exti.h"
#include "led.h"extern u8 ov_sta; //在exit.c里面定义//由于OV7725传感器安装方式原因,OV7725_WINDOW_WIDTH相当于LCD的高度,OV7725_WINDOW_HEIGHT相当于LCD的宽度
//注意:此宏定义只对OV7725有效
#define  OV7725_WINDOW_WIDTH        320 // <=320
#define  OV7725_WINDOW_HEIGHT       240 // <=240FRESULT res_sd;//文件操作结果
FIL fnew; //文件对
UINT fnum; //文件成功读写数量//更新LCD显示
void camera_refresh(void)
{u32 i,j;u16 color;BITMAPINFO bmp;int s1 = 0;int s2 = 0;int s3 = 0;int s4 = 0;//按下S2显示图片if(KEY_Scan(1) == S2){LCD_Clear(BLACK);ai_load_picfile("0:test1.bmp",0,0,lcddev.width,lcddev.height,1);//显示图片delay_ms(5000);      //清屏函数LCD_Clear(BLACK),可以消除分屏现象。return;}//按下S1拍摄图片if(ov_sta && KEY_Scan(1) == S1){//打开文件,若不存在就创建res_sd = f_open(&fnew, "0:test1.bmp", FA_OPEN_ALWAYS | FA_WRITE);//文件打开成功if(res_sd == FR_OK){//填写文件信息头信息  bmp.bmfHeader.bfType = 0x4D42;               //bmp类型  bmp.bmfHeader.bfOffBits=sizeof(bmp.bmfHeader) + sizeof(bmp.bmiHeader) + sizeof(bmp.RGB_MASK);                       //位图信息结构体所占的字节数bmp.bmfHeader.bfSize= bmp.bmfHeader.bfOffBits + 320*240*2; //文件大小(信息结构体+像素数据)bmp.bmfHeader.bfReserved1 = 0x0000;       //保留,必须为0bmp.bmfHeader.bfReserved2 = 0x0000;            //填写位图信息头信息  bmp.bmiHeader.biSize=sizeof(bmp.bmiHeader);                   //位图信息头的大小bmp.bmiHeader.biWidth=320;                                                       //位图的宽度bmp.bmiHeader.biHeight=240;                 //图像的高度bmp.bmiHeader.biPlanes=1;                   //目标设别的级别,必须是1bmp.bmiHeader.biBitCount=16;          //每像素位数bmp.bmiHeader.biCompression=3;          //每个象素的比特由指定的掩码(RGB565掩码)决定。  (非常重要)bmp.bmiHeader.biSizeImage=320*240*2;  //实际位图所占用的字节数(仅考虑位图像素数据)bmp.bmiHeader.biXPelsPerMeter=0;            //水平分辨率bmp.bmiHeader.biYPelsPerMeter=0;            //垂直分辨率bmp.bmiHeader.biClrImportant=0;       //说明图像显示有重要影响的颜色索引数目,0代表所有的颜色一样重要bmp.bmiHeader.biClrUsed=0;               //位图实际使用的彩色表中的颜色索引数,0表示使用所有的调色板项//RGB565格式掩码bmp.RGB_MASK[0] = 0X00F800;bmp.RGB_MASK[1] = 0X0007E0;bmp.RGB_MASK[2] = 0X00001F;//写文件头进文件  res_sd= f_write(&fnew, &bmp, sizeof(bmp), &fnum);//读指针复位OV7725_RRST=0;              //开始复位读指针OV7725_RCK_L;OV7725_RCK_H;OV7725_RCK_L;OV7725_RRST=1;             //复位读指针结束 OV7725_RCK_H; /*图像花屏的原因在于读取时的干扰和读取时漏掉几个像素*/for(i=0;i<240;i++){for(j=0;j<320;j++){OV7725_RCK_L;color=GPIOC->IDR&0XFF;  //读数据OV7725_RCK_H; color<<=8;  OV7725_RCK_L;color|=GPIOC->IDR&0XFF;  //读数据OV7725_RCK_H; //写位图信息头进内存卡f_write(&fnew, &color, sizeof(color), &fnum);}}//关闭文件f_close(&fnew);delay_ms(1000);return;}}//没有按键按下,刷新LCDif(ov_sta){LCD_Scan_Dir(U2D_L2R);       //从上到下,从左到右 LCD_WriteRAM_Prepare();   //开始写入GRAM    //读指针复位OV7725_RRST=0;              //开始复位读指针 OV7725_RCK_L;OV7725_RCK_H;OV7725_RCK_L;OV7725_RRST=1;                //复位读指针结束 OV7725_RCK_H; /*图像花屏的原因在于读取时的干扰和读取时漏掉几个像素*/for(i=0;i<240;i++){for(j=0;j<320;j++){OV7725_RCK_L;color=GPIOC->IDR&0XFF;  //读数据OV7725_RCK_H; color<<=8;  OV7725_RCK_L;color|=GPIOC->IDR&0XFF;  //读数据OV7725_RCK_H; LCD->LCD_RAM=color; }}ov_sta=0;                 //开始下一次采集LCD_Scan_Dir(DFT_SCAN_DIR);    //恢复默认扫描方向 }
}int main(void)
{    u8 lightmode=0,saturation=2,brightness=2,contrast=2,effect=0;u8 i = 0;delay_init();          //延时函数初始化     uart_init(9600);      //串口初始化为9600LCD_Init();                 //初始化LCD液晶显示屏KEY_Init();                    //按键初始化exfuns_init();           //为fatfs相关变量申请内存  f_mount(0,fs[0]);     //挂载SD卡 piclib_init();          //初始化画图while(OV7725_Init() != 0);              //初始化OV7725摄像头LCD_ShowString(60,210,200,16,16,"OV7725 Init OK");//特效OV7725_Light_Mode(lightmode);OV7725_Color_Saturation(saturation);OV7725_Brightness(brightness);OV7725_Contrast(contrast);OV7725_Special_Effects(effect);//设置输出格式OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//QVGA模式输出//输出使能OV7725_CS=0;EXTI8_Init();              //使能定时器捕获LCD_Clear(BLACK);while(1){camera_refresh();//更新显示i++;if(i==15)//DS0闪烁.{i=0;LED0=!LED0;}}
}

有关OV7725配置的代码暂时不贴了。

另外需要注意的是,拍照过程中可能会出现割屏现象(即屏幕分成几块),这个时候可以通过清屏函数LCD_Clear(BLACK)消除该现象。

附源码Github地址:https://github.com/jack13163/OV7725_BMP

STM32F103实现OV7725拍照存储为BMP位图相关推荐

  1. BMP位图格式的内存存储方式

    最近在捣鼓Kinect 存储的 raw data,使用 kinect输出并保存红外数据流 ColorImageFormat.InfraredResolution640x480Fps30.其红外数据流的 ...

  2. 浅析BMP位图文件结构(含Demo)[转]

    <!--done-->   关于BMP位图格式在网上可以找到比较详细的相关文档,有兴趣的可以搜索标题为"BMP文件结构的探索"的文章,可以在搜索结果中找到一个WORD文 ...

  3. C语言实现将彩色BMP位图转化为二值图

    2019独角兽企业重金招聘Python工程师标准>>> CTF做了图片的隐写题,还没有形成系统的认识,先来总结一下BMP图的组成,并通过将彩色图转为二值图的例子加深下理解. 只写了位 ...

  4. 图像识别 - C++读取bmp位图入门

    原文链接 =============================================================================================== ...

  5. C++ 实现BMP位图读写

    BMP文件读写 1. 问题描述 分析图像格式BMP –可借助Matlab体会图像的读写和显示. 利用C语言编写程序,实现图像的输入和输出和显示. –自行编写BMP文件的读写. –调用开源库实现其他若干 ...

  6. BMP位图转为RGB三通道图

    文章目录 读取BMP位图转为RGB三通道图 注意 相关/参考链接 本人机器开发环境 用到的图像 大小端模式介绍: 完整代码: 结果 读取BMP位图转为RGB三通道图 个人总结,目的是给自己日后参考,或 ...

  7. c语言读取24位bmp图像,[原创]在TC下显示24位真彩色BMP位图

    [原创]在TC下显示24位真彩色BMP位图 在TC下显示24位BMP 虽然在TC显示24位图像上的速度远远比不上256色的速度快,但是真彩色色彩带给我们的视觉上的冲击是256色远远不能达到的.我们今天 ...

  8. BMP位图基础:通过UltraEdit解析BMP文件内部结构

    初见位图 我们先打开画图随便画一幅图并采用24位bmp图像格式保存,就得到了一张24位真彩色的位图 BMP位图一般由4部分组成:文件头信息块.图像描述信息块.颜色表(在真彩色模式无颜色表)和图像数据区 ...

  9. SD卡FAT32文件结构(2)---创建与写入BMP位图

    下图为本人512MB诺基亚SD卡根目录的数据, 1(红色处):卷标,也就是名称,我的SD卡名称为WHETA. 2(蓝色处):文件名. 3(紫色处):文件类型.    从蓝色与紫色处,可以看出我的根目录 ...

  10. C++ 处理HBITMAP类型的.bmp位图文件, 代码工具

    1. 存储为HBITMAP类型的.bmp位图文件 参考:C++保存HBITMAP为位图文件的实现方法(IT技术) (qb5200.com) ImageHelper.h  #pragma once#in ...

最新文章

  1. 计算机组成原理时序,计算机组成原理 中央处理器(CPU) 多级时序系统
  2. Ubuntu 18.04安装Matlab 2018
  3. Mac下pycharm如何安装pytorch
  4. 开发日记-20190621 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  5. HTTP Status 500 - Servlet.init() for servlet springmvc threw exception
  6. 字符串对比 (STl强制转换字符串)
  7. 收藏!!如何 Get 机器学习必备的算法技能? | 逻辑回归
  8. linux shell脚本的执行方式与区别
  9. 一个兼容所有浏览器的阻止事件冒泡方法
  10. c++面向对象高级编程 学习三 堆、栈和内存泄漏
  11. [MySQL 5.6优化] --order by limit x,x 优化
  12. java response 输出流_java-springmvc+filter 替换输出流、response、响应内容
  13. Docker教程(三) Docker网络访问和数据管理
  14. 精通oracle能干嘛,五分鍾精通Oracle表空間
  15. python day33
  16. 【专栏必读】数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解
  17. ubuntu安装公式编辑器mathtype, wine中文乱码,ubuntu中文字体
  18. 【原创】驳罗素《我为什么不是基督徒》
  19. (送书)《美好企业》导读:企业家需要超越世俗的成功
  20. java爬虫正则表达式_Java爬虫预热之正则表达式 - 菜鸟头头

热门文章

  1. fbp是什么岗位_BP是什么职位?
  2. java tld_java – 根据标签文件中的TLD或属性指令,属性项不接受任何表达式
  3. 供应链金融的三种业务模式
  4. html 嵌入页面,html5页面嵌入
  5. 少有人知的 Python “重试机制“:tenacity
  6. 朴实无华!注意力机制神经网络解析
  7. 腾讯云短信发送php
  8. AI代替30%班主任工作 尚德机构督学机器人上线
  9. 条形码生成软件如何批量生成ISBN条码
  10. Axure8有效注册码