当前位置:首页 > 代码 > 正文

bmp文件读写源代码(导出bmp格式)

admin 发布:2022-12-19 04:20 116


今天给各位分享bmp文件读写源代码的知识,其中也会对导出bmp格式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

用vc 读取BMP图片并显示出来代码怎么写啊?

显示位图文件

HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,_T(“xxx.bmp”),Image_Bitmap,0,0,

Lr_CreateDibSection|Lr_DefaultSize|Lr_LoadFromFile); //加载bmp文件

CBitmap bitmap;

bitmap.Attach(hBitmap); //关联位图对象

CDC dcimage;

dcimage.CreateCompatibleDC(pDC); //内存DC

BITMAP bmp;

bitmap.GetBitmap(bmp); //获取位图信息

dcimage.SelectObject(bitmap); //选取位图对象

pDC-BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,dcimage,0,0,SRCCOPY); //显示

这是单文档显示位图文件的方法,你照着看吧。

C++读取BMP图像

#includemath.h

#include iomanip.h

#include stdlib.h

#include windows.h

#include stdio.h

#include stdlib.h

#include iostream.h

#include fstream.h

//---------------------------------------------------------------------------------------

//以下该模块是完成BMP图像(彩色图像是24bit RGB各8bit)的像素获取,并存在文件名为xiang_su_zhi.txt中

unsigned char *pBmpBuf;//读入图像数据的指针

int bmpWidth;//图像的宽

int bmpHeight;//图像的高

RGBQUAD *pColorTable;//颜色表指针

int biBitCount;//图像类型,每像素位数

//-------------------------------------------------------------------------------------------

//读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中

bool readBmp(char *bmpName)

{

FILE *fp=fopen(bmpName,"rb");//二进制读方式打开指定的图像文件

if(fp==0) return 0;

//跳过位图文件头结构BITMAPFILEHEADER

fseek(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;//灰度图像有颜色表,且颜色表表项为256

if(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;//读取文件成功

}

//-----------------------------------------------------------------------------------------

//给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中

bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,

int biBitCount, RGBQUAD *pColorTable)

{

//如果位图数据指针为0,则没有数据传入,函数返回

if(!imgBuf)

return 0;

//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0

int colorTablesize=0;

if(biBitCount==8)

colorTablesize=1024;

//待存储图像数据每行字节数为4的倍数

int lineByte=(width * biBitCount/8+3)/4*4;

//以二进制写的方式打开文件

FILE *fp=fopen(bmpName,"wb");

if(fp==0) return 0;

//申请位图文件头结构变量,填写文件头信息

BITMAPFILEHEADER fileHead;

fileHead.bfType = 0x4D42;//bmp类型

//bfSize是图像文件4个组成部分之和

fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

+ colorTablesize + lineByte*height;

fileHead.bfReserved1 = 0;

fileHead.bfReserved2 = 0;

//bfOffBits是图像文件前3个部分所需空间之和

fileHead.bfOffBits=54+colorTablesize;

//写文件头进文件

fwrite(fileHead, sizeof(BITMAPFILEHEADER),1, fp);

//申请位图信息头结构变量,填写信息头信息

BITMAPINFOHEADER head;

head.biBitCount=biBitCount;

head.biClrImportant=0;

head.biClrUsed=0;

head.biCompression=0;

head.biHeight=height;

head.biPlanes=1;

head.biSize=40;

head.biSizeImage=lineByte*height;

head.biWidth=width;

head.biXPelsPerMeter=0;

head.biYPelsPerMeter=0;

//写位图信息头进内存

fwrite(head, sizeof(BITMAPINFOHEADER),1, fp);

//如果灰度图像,有颜色表,写入文件

if(biBitCount==8)

fwrite(pColorTable, sizeof(RGBQUAD),256, fp);

//写位图数据进文件

fwrite(imgBuf, height*lineByte, 1, fp);

//关闭文件

fclose(fp);

return 1;

}

//----------------------------------------------------------------------------------------

//以下为像素的读取函数

void xiang_su_du_qu()

{

//读入指定BMP文件进内存

char readPath[]="nv.BMP";

readBmp(readPath);

//输出图像的信息

cout"width="bmpWidth" height="bmpHeight" biBitCount="biBitCountendl;

//循环变量,图像的坐标

//每行字节数

int lineByte=(bmpWidth*biBitCount/8+3)/4*4;

//循环变量,针对彩色图像,遍历每像素的三个分量

int m=0,n=0,count_xiang_su=0;

//将图像左下角1/4部分置成黑色

ofstream outfile("图像像素.txt",ios::in|ios::trunc);

if(biBitCount==8) //对于灰度图像

{

//------------------------------------------------------------------------------------

//以下完成图像的分割成8*8小单元,并把像素值存储到指定文本中。由于BMP图像的像素数据是从

//左下角:由左往右,由上往下逐行扫描的

int L1=0;

int hang=63;

int lie=0;

//int L2=0;

//int fen_ge=8;

for(int fen_ge_hang=0;fen_ge_hang8;fen_ge_hang++)//64*64矩阵行循环

{

for(int fen_ge_lie=0;fen_ge_lie8;fen_ge_lie++)//64*64列矩阵循环

{

//--------------------------------------------

for(L1=hang;L1hang-8;L1--)//8*8矩阵行

{

for(int L2=lie;L2lie+8;L2++)//8*8矩阵列

{

m=*(pBmpBuf+L1*lineByte+L2);

outfilem" ";

count_xiang_su++;

if(count_xiang_su%8==0)//每8*8矩阵读入文本文件

{

outfileendl;

}

}

}

//---------------------------------------------

hang=63-fen_ge_hang*8;//64*64矩阵行变换

lie+=8;//64*64矩阵列变换

//该一行(64)由8个8*8矩阵的行组成

}

hang-=8;//64*64矩阵的列变换

lie=0;//64*64juzhen

}

}

//double xiang_su[2048];

//ofstream outfile("xiang_su_zhi.txt",ios::in|ios::trunc);

if(!outfile)

{

cout"open error!"endl;

exit(1);

}

else if(biBitCount==24){//彩色图像

for(int i=0;ibmpHeight;i++)

{

for(int j=0;jbmpWidth;j++)

{

for(int k=0;k3;k++)//每像素RGB三个分量分别置0才变成黑色

{

//*(pBmpBuf+i*lineByte+j*3+k)-=40;

m=*(pBmpBuf+i*lineByte+j*3+k);

outfilem" ";

count_xiang_su++;

if(count_xiang_su%8==0)

{

outfileendl;

}

//n++;

}

n++;

}

}

cout"总的像素个素为:"nendl;

cout"----------------------------------------------------"endl;

}

//将图像数据存盘

char writePath[]="nvcpy.BMP";//图片处理后再存储

saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);

//清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间

delete []pBmpBuf;

if(biBitCount==8)

delete []pColorTable;

}

void main()

{

xiang_su_du_qu();

}

用c语言读取24位位图bmp文件

可以使用C语言标准函数库中的fopen、fseek、fclose等系列函数来打开bmp位图文件,以及进行相应的处理,下面是一个demo,仅供参考。以下代码在vc6.0中编译通过。

#include stdio.h

#include stdlib.h

#define BITMAPFILEHEADERLENGTH 14   // The bmp FileHeader length is 14

#define BM 19778                    // The ASCII code for BM

/* Test the file is bmp file or not */

void bmpFileTest(FILE* fpbmp);

/* To get the OffSet of header to data part */

void bmpHeaderPartLength(FILE* fpbmp);

/* To get the width and height of the bmp file */

void BmpWidthHeight(FILE* fpbmp);

//get r,g,b data

void bmpDataPart(FILE* fpbmp);

// output data to corresponding txt file

void bmpoutput(FILE *fpout);

unsigned int OffSet = 0;    // OffSet from Header part to Data Part

long width ;          // The Width of the Data Part

long height ;         // The Height of the Data Part

unsigned char r[2000][2000],output_r[2000][2000];

unsigned char g[2000][2000],output_g[2000][2000];

unsigned char b[2000][2000],output_b[2000][2000];

int main(int argc, char* argv[])

{

     /* Open bmp file */

unsigned char *fp_temp;

     FILE *fpbmp;

     FILE *fpout;

     fpbmp= fopen("1.bmp", "rb");

     if (fpbmp == NULL)

     {

 printf("Open bmp failed!!!\n");

 return 1;

     }

     fpout= fopen("out.bmp", "wb+");

     if (fpout == NULL)

     {

 printf("Open out.bmp failed!!!\n");

 return 1;

     }

     

     bmpFileTest(fpbmp);                //Test the file is bmp file or not

     bmpHeaderPartLength(fpbmp);        //Get the length of Header Part

     BmpWidthHeight(fpbmp);             //Get the width and width of the Data Part

     

     

//

fseek(fpbmp, 0L, SEEK_SET);

fseek(fpout, 0L, SEEK_SET);

 

fp_temp=(unsigned char *)malloc(OffSet);

         fread(fp_temp, 1, OffSet, fpbmp);

fwrite(fp_temp,1,OffSet,fpout);

     

bmpDataPart(fpbmp);                //Reserve the data to file 

     

/*

 

 

 如果您想对图片进行处理,请您再这里插入处理函数!!!!!!!!!!!!!!!!!!

 

*/

bmpoutput(fpout);

fclose(fpbmp);

fclose(fpout);

         return 0;

}

void bmpoutput(FILE* fpout)

{

         int i, j=0;

         int stride;

unsigned char* pixout=NULL;

   

stride=(24*width+31)/8;

stride=stride/4*4;

pixout=(unsigned char *)malloc(stride);

 

fseek(fpout, OffSet, SEEK_SET);

for(j=0;jheight;j++)

{

   for(i=0;iwidth;i++)

        {

            pixout[i*3+2]=output_r[height-1-j][i];

            pixout[i*3+1]=output_g[height-1-j][i];

            pixout[i*3]  =output_b[height-1-j][i];

        }

fwrite(pixout, 1, stride, fpout);

}

}

void bmpDataPart(FILE* fpbmp)

{

         int i, j=0;

int stride;

unsigned char* pix=NULL;

FILE* fpr;

         FILE* fpg;

FILE* fpb;

     

     if((fpr=fopen("bmpr.txt","w+")) == NULL)

     {

    printf("Failed to construct file bmpr.txt.!!!");

exit(1);

     }

     if((fpg=fopen("bmpg.txt","w+")) == NULL)

     {

 printf("Failed to construct file bmpg.txt.!!!");

 exit(1);

     }

if((fpb=fopen("bmpb.txt","w+")) == NULL)

     {

printf("Failed to construct file bmpb.txt.!!!");

exit(1);

     }

 

     fseek(fpbmp, OffSet, SEEK_SET);

stride=(24*width+31)/8;

stride=stride/4*4;

pix=(unsigned char *)malloc(stride);

 

for(j=0;jheight;j++)

{

fread(pix, 1, stride, fpbmp);

   for(i=0;iwidth;i++)

        {

            r[height-1-j][i]   =pix[i*3+2];

            g[height-1-j][i]   =pix[i*3+1];

            b[height-1-j][i]   =pix[i*3];

output_r[height-1-j][i]   =pix[i*3+2];

            output_g[height-1-j][i]   =pix[i*3+1];

            output_b[height-1-j][i]   =pix[i*3];

        }

}

 for(i =0; i  height; i++)

     {

for(j = 0; j  width-1; j++)

{   

fprintf(fpb,"%4d",b[i][j]);

fprintf(fpg,"%4d",g[i][j]);

fprintf(fpr,"%4d",r[i][j]);

}

fprintf(fpb,"%4d\n",b[i][j]);

fprintf(fpg,"%4d\n",g[i][j]);

fprintf(fpr,"%4d\n",r[i][j]);

 }

  

fclose(fpr);

fclose(fpg);

fclose(fpb);

 

}

void bmpFileTest(FILE* fpbmp)

{     

     unsigned short bfType = 0;

 

     fseek(fpbmp, 0L, SEEK_SET);//seek_set 起始位置

     fread(bfType, sizeof(char), 2, fpbmp);

     if (BM != bfType)

     {

 printf("This file is not bmp file.!!!\n");

 exit(1);

     }

}

/* To get the OffSet of header to data part */

void bmpHeaderPartLength(FILE* fpbmp)

{

     fseek(fpbmp, 10L, SEEK_SET);

     fread(OffSet, sizeof(char), 4, fpbmp);  

     printf("The Header Part is of length %d.\n", OffSet);

}

/* To get the width and height of the bmp file */

void BmpWidthHeight(FILE* fpbmp)

{

     fseek(fpbmp, 18L, SEEK_SET);

     fread(width, sizeof(char), 4, fpbmp);

     fseek(fpbmp, 22L, SEEK_SET);

     fread(height, sizeof(char), 4, fpbmp);

     printf("The Width of the bmp file is %ld.\n", width);

     printf("The Height of the bmp file is %ld.\n", height);

}

求处理图片bmp文件的程序代码(C语言)

bmp文件由文件头,位图信息头,颜色表,和数据部组成

文件头:

typedef struct tagBITMAPFILEHEADER

{

    WORD bfType;//位图文件的类型,必须为BM(1-2字节)

    DWORD bfSize;//位图文件的大小,以字节为单位(3-6字节,低位在前)

    WORD bfReserved1;//位图文件保留字,必须为0(7-8字节)

    WORD bfReserved2;//位图文件保留字,必须为0(9-10字节)

    DWORD bfOffBits;//位图数据的起始位置,以相对于位图(11-14字节,低位在前)

    //文件头的偏移量表示,以字节为单位

}BITMAPFILEHEADER;

位图信息头:

typedefstructtagBITMAPINFOHEADER{

    DWORDbiSize;//本结构所占用字节数(15-18字节)

    LONGbiWidth;//位图的宽度,以像素为单位(19-22字节)

    LONGbiHeight;//位图的高度,以像素为单位(23-26字节)

    WORDbiPlanes;//目标设备的级别,必须为1(27-28字节)

    WORDbiBitCount;//每个像素所需的位数,必须是1(双色),(29-30字节)

    //4(16色),8(256色)16(高彩色)或24(真彩色)之一

    DWORDbiCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)

    //1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一

    DWORDbiSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)

    LONGbiXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)

    LONGbiYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)

    DWORDbiClrUsed;//位图实际使用的颜色表中的颜色数(47-50字节)

    DWORDbiClrImportant;//位图显示过程中重要的颜色数(51-54字节)

}BITMAPINFOHEADER;

打开文件读出这些信息,然后用一个RGB的构造体二维数组(height*width)来读取数据部分

关于bmp文件读写源代码和导出bmp格式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/2294.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载