當前位置:首頁 » 編程語言 » c語言bmp怎麼讀
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言bmp怎麼讀

發布時間: 2022-07-21 04:20:32

㈠ 怎樣用c語言實現BMP讀存

直接用fread讀取就可以。你得知道bmp的格式,頭文件存放的信息,讀出出來就知道文件的大小,解析度,大小端等。在讀取每一位的顏色信息。注意bmp是按行倒敘存取,還有注意bmp有位元組對齊的。

㈡ 用c語言讀取24位點陣圖bmp文件

可以使用C語言標准函數庫中的fopen、fseek、fclose等系列函數來打開bmp點陣圖文件,以及進行相應的處理,下面是一個demo,僅供參考。以下代碼在vc6.0中編譯通過。


#include<stdio.h>
#include<stdlib.h>
#//ThebmpFileHeaderlengthis14
#defineBM19778//TheASCIIcodeforBM
/*Testthefileisbmpfileornot*/
voidbmpFileTest(FILE*fpbmp);
/**/
voidbmpHeaderPartLength(FILE*fpbmp);
/**/
voidBmpWidthHeight(FILE*fpbmp);
//getr,g,bdata
voidbmpDataPart(FILE*fpbmp);
//
voidbmpoutput(FILE*fpout);
unsignedintOffSet=0;//
longwidth;//TheWidthoftheDataPart
longheight;//TheHeightoftheDataPart
unsignedcharr[2000][2000],output_r[2000][2000];
unsignedcharg[2000][2000],output_g[2000][2000];
unsignedcharb[2000][2000],output_b[2000][2000];
intmain(intargc,char*argv[])
{
/*Openbmpfile*/
unsignedchar*fp_temp;
FILE*fpbmp;
FILE*fpout;
fpbmp=fopen("1.bmp","rb");
if(fpbmp==NULL)
{
printf("Openbmpfailed!!! ");
return1;
}
fpout=fopen("out.bmp","wb+");
if(fpout==NULL)
{
printf("Openout.bmpfailed!!! ");
return1;
}

bmpFileTest(fpbmp);//Testthefileisbmpfileornot
bmpHeaderPartLength(fpbmp);//GetthelengthofHeaderPart
BmpWidthHeight(fpbmp);//


//
fseek(fpbmp,0L,SEEK_SET);
fseek(fpout,0L,SEEK_SET);

fp_temp=(unsignedchar*)malloc(OffSet);
fread(fp_temp,1,OffSet,fpbmp);
fwrite(fp_temp,1,OffSet,fpout);

bmpDataPart(fpbmp);//Reservethedatatofile

/*


如果您想對圖片進行處理,請您再這里插入處理函數!!!!!!!!!!!!!!!!!!

*/
bmpoutput(fpout);
fclose(fpbmp);
fclose(fpout);
return0;
}
voidbmpoutput(FILE*fpout)
{
inti,j=0;
intstride;
unsignedchar*pixout=NULL;

stride=(24*width+31)/8;
stride=stride/4*4;
pixout=(unsignedchar*)malloc(stride);

fseek(fpout,OffSet,SEEK_SET);
for(j=0;j<height;j++)
{
for(i=0;i<width;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);
}
}
voidbmpDataPart(FILE*fpbmp)
{
inti,j=0;
intstride;
unsignedchar*pix=NULL;
FILE*fpr;
FILE*fpg;
FILE*fpb;

if((fpr=fopen("bmpr.txt","w+"))==NULL)
{
printf("Failedtoconstructfilebmpr.txt.!!!");
exit(1);
}
if((fpg=fopen("bmpg.txt","w+"))==NULL)
{
printf("Failedtoconstructfilebmpg.txt.!!!");
exit(1);
}
if((fpb=fopen("bmpb.txt","w+"))==NULL)
{
printf("Failedtoconstructfilebmpb.txt.!!!");
exit(1);
}

fseek(fpbmp,OffSet,SEEK_SET);
stride=(24*width+31)/8;
stride=stride/4*4;
pix=(unsignedchar*)malloc(stride);

for(j=0;j<height;j++)
{
fread(pix,1,stride,fpbmp);
for(i=0;i<width;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 ",b[i][j]);
fprintf(fpg,"%4d ",g[i][j]);
fprintf(fpr,"%4d ",r[i][j]);
}

fclose(fpr);
fclose(fpg);
fclose(fpb);

}
voidbmpFileTest(FILE*fpbmp)
{
unsignedshortbfType=0;

fseek(fpbmp,0L,SEEK_SET);//seek_set起始位置
fread(&bfType,sizeof(char),2,fpbmp);
if(BM!=bfType)
{
printf("Thisfileisnotbmpfile.!!! ");
exit(1);
}
}
/**/
voidbmpHeaderPartLength(FILE*fpbmp)
{
fseek(fpbmp,10L,SEEK_SET);
fread(&OffSet,sizeof(char),4,fpbmp);
printf("TheHeaderPartisoflength%d. ",OffSet);
}
/**/
voidBmpWidthHeight(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("TheWidthofthebmpfileis%ld. ",width);
printf("TheHeightofthebmpfileis%ld. ",height);
}

㈢ 編輯器對bmp文件怎麼讀取(C語言)

只修改長寬是不夠的,參考
http://www.fastgraph.com/help/bmp_header_format.html
再多改一些內容吧,如「size of image data in bytes」

㈣ C語言 讀取BMP文件

讀取文件方法:先定義一個int類型的文件描述符變數,再用open函數(適合在Unix或Linux環境下,若是在windows環境下應先定義一個FILE類型的指針變數,再調用fopen函數)打開所要讀取的BMP文件即可。如果你要更改BMP文件的顏色,那麼就看你對BMP格式的圖片的存儲原理知道多少了,bmp是無損壓縮圖片的一種演算法,一般是由圖片頭部,文件頭部,顏色表等組成,要改變顏色,就需要改變顏色表中的內容,當然由於BMP演算法在不斷改進,其過程和組成部分可能有變化,上面的僅是一般情況。

㈤ 如何在c語言 讀取BMP圖片的信息

使用opencv的庫吧,安裝很簡單,處理圖像的功能很強大
#include "cv.h"
#include "highgui.h"

int main( int argc, char** argv )
{
IplImage* pImg; //聲明IplImage指針

//載入圖像
if( argc == 2 &&
(pImg = cvLoadImage(「XXX.bmp」, 1)) != 0 )//這里bmp要放到工程文件夾下,否則寫絕對路徑,取像素值請用:pImg.ptr<Vec3b>(i)[j]
{
cvNamedWindow( "Image", 1 );//創建窗口
cvShowImage( "Image", pImg );//顯示圖像

cvWaitKey(0); //等待按鍵

cvDestroyWindow( "Image" );//銷毀窗口
cvReleaseImage( &pImg ); //釋放圖像
return 0;
}

return -1;
}

㈥ 請問如何用C語言讀取bmp文件和pix文件

unsigned char *pix=new unsigned char[bm.widthpiexl*bm.height];
SetBitmapPiex(bitmap,bm.widthpiexl*bm.height,pix);
這樣子便可以得到圖像的像素參數,存放在pix數組內,
BMP文件由文件頭、點陣圖信息頭、顏色信息和圖形數據四部分組成。顏色信息包含圖像所用到的顏色表,顯示圖像時需用到這個顏色表來生成調色板.我們需要做的是,新建PIX文件後,用WINHEX打開,准備好模板文件,提取BMP中的顏色信息,粘貼到PIX文件的頭文件中,然後保存即可.可以用ddraw.h讀詳細資料請看msdn,希望能幫到你。

㈦ 如何用C語言讀取bmp文件和pix文件

用fread讀取bmp文件,分析bmp文件頭,得出bmp的像素數據,然後訪問和修改像素數據,就可以了。此問題如果你沒有相關的圖像處理類,必須自己去查找bmp文件的結構,按照bmp文件的結構自己編碼來完成圖像處理功能。

㈧ c語言,怎樣讀取一個BMP圖片

#ifndef IMAGE_H
#define IMAGE_H
void image_info(FILE* file);
void image_save(FILE *file);
void image_gray();
void image_binarization();
void image_opposite();
void image_channel(); //抽取RGB通道
void image_bright();//改變圖像亮度

typedef struct BMP
{
//14位元組
unsigned short bfType; //文件標識 2位元組 必須為BM
unsigned int bfSize; //文件大小 4位元組
unsigned short bfReserved1; //保留,每位元組以"00"填寫 2位元組
unsigned short bfReserved2; //同上 2位元組
unsigned int bfOffBits; //記錄圖像數據區的起始位置(圖象數據相對於文件頭位元組的偏移量)。 4位元組

//40位元組
unsigned int biSize; //表示本結構的大小 4位元組
int biWidth; //點陣圖的寬度 4位元組
int biHeight; //點陣圖的高度 4位元組
unsigned short biPlanes; //永遠為1 , 2位元組
unsigned short biBitCount; //點陣圖的位數 分為1 4 8 16 24 32 2位元組
unsigned int biCompression; //壓縮說明 4位元組
unsigned int biSizeImage; //表示點陣圖數據區域的大小以位元組為單位 4位元組
int biXPelsPerMeter; //用象素/米表示的水平解析度 4位元組
int biYPelsPerMeter; //用象素/米表示的垂直解析度 4位元組
unsigned int biClrUsed; //點陣圖使用的顏色索引數 4位元組
unsigned int biClrImportant; //對圖象顯示有重要影響的顏色索引的數目 4位元組

} BMP;

int line_byte;
unsigned char *imagedata;
extern BMP bmp;
extern int line_byte;
extern unsigned char *imagedata;
#endif

//image_rw.c文件

#include<stdio.h>
#include<stdlib.h>
#include"image.h"

void image_info(FILE *file)
{

int times=3; //輸入文件名次數。
char bmp_name[10]; //文件名

printf("\nplease enter a file name for reading:");
do
{
if (times<3)
{
printf("\nplease enter a file name for reading again:");
}
fflush(stdin);
gets(bmp_name);
//printf("\n%s",bmp_name);
file=fopen(bmp_name,"rb+"); //打開一個文件進行讀寫操作。
--times;
if (file==NULL)
{
printf("\nerror opening %s for reading! ",bmp_name);
}
else
{
break;
}
}
while(times!=0);

if (times==0)
{
printf("\nsorry, shutdown!");
exit(1);
}

//讀取圖像信息

fseek(file,0L,0); //讀取圖像文件類型
fread(&bmp,sizeof(BMP),1,file);
printf("\n bmp tpye: %u",bmp.bfType);
printf("\n bmp size: %u",bmp.bfSize);
printf("\n bmp reserved1: %u",bmp.bfReserved1);
printf("\n bmp reserved2: %u",bmp.bfReserved2);
printf("\n bmp offBits: %u",bmp.bfOffBits);

printf("\n bmp bisize: %u",bmp.biSize);
printf("\n bmp biWidth: %d",bmp.biWidth);
printf("\n bmp biHeight: %d",bmp.biHeight);
printf("\n bmp biplans: %u",bmp.biPlanes);
printf("\n bmp biBitCount: %u",bmp.biBitCount);
printf("\n bmp biCompression: %u",bmp.biCompression);
printf("\n bmp biSizeImage: %u",bmp.biSizeImage);
printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);
printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);
printf("\n bmp biClrUsed: %u",bmp.biClrUsed);
printf("\n bmp biClrImportant: %u\n",bmp.biClrImportant);

line_byte=(bmp.biWidth*bmp.biBitCount/8+3)/4*4; //獲得圖像數據每行的數據個數
//printf("dfsa%u",bmp.line_byte);
//bmp.imagedata=NULL;
imagedata=(unsigned char*)malloc(bmp.biSizeImage);

fseek(file,(long)bmp.bfOffBits,0);
fread(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);

fclose(file);
}

//保存圖像
void image_save(FILE *file)
{
int times=3; //輸入文件名次數。
char bmp_name[10]; //文件名
//int i; //記錄數據區個數

printf("\nplease enter a file name for writeing:");
do
{
if (times<3)
{
printf("\nplease enter a file name for writeing again:");
}
fflush(stdin);
gets(bmp_name);
printf("\n%s",bmp_name);
file=fopen(bmp_name,"wb+"); //打開一個文件進行讀寫操作。
--times;
if (file==NULL)
{
printf("\nerror opening %s for writing",bmp_name);
}
else
{
break;
}
}
while(times!=0);

if (times==0)
{
printf("\nsorry, shutdown!");
exit(1);
}

//寫文件頭
printf("\n%s",bmp_name);
fseek(file,0L,0); //圖像文件類型
fwrite(&(bmp.bfType),sizeof(short),1,file);
printf("\n bmp tpye: %d",bmp.bfType);

fseek(file,2L,0); //圖像文件大小
fwrite(&(bmp.bfSize),sizeof(int),1,file);
printf("\n bmp size: %d",bmp.bfSize);

fseek(file,6L,0); //圖像文件保留字1
fwrite(&(bmp.bfReserved1),sizeof(short),1,file);
printf("\n bmp reserved1: %d",bmp.bfReserved1);

fseek(file,8L,0); //圖像文件保留字2
fwrite(&(bmp.bfReserved2),sizeof(short),1,file);
printf("\n bmp reserved2: %d",bmp.bfReserved2);

fseek(file,10L,0);//數據區的偏移量
fwrite(&(bmp.bfOffBits),sizeof(short),1,file);
printf("\n bmp offBits: %d",bmp.bfOffBits);

fseek(file,14L,0);//文件頭結構大小
fwrite(&(bmp.biSize),sizeof(int),1,file);
printf("\n bmp bisize: %d",bmp.biSize);

fseek(file,18L,0);//圖像的寬度
fwrite(&(bmp.biWidth),sizeof(int),1,file);
printf("\n bmp biWidth: %d",bmp.biWidth);

fseek(file,22L,0);//圖像的高度
fwrite(&(bmp.biHeight),sizeof(int),1,file);
printf("\n bmp biHeight: %d",bmp.biHeight);

fseek(file,24L,0);//圖像的面數
fwrite(&(bmp.biPlanes),sizeof(short),1,file);
printf("\n bmp biplans: %d",bmp.biPlanes);

fseek(file,28L,0);//圖像一個像素的位元組數
fwrite(&(bmp.biBitCount),sizeof(short),1,file);
printf("\n bmp biBitCount: %d",bmp.biBitCount);

fseek(file,30L,0);//圖像壓縮信息
fwrite(&(bmp.biCompression),sizeof(short),1,file);
printf("\n bmp biCompression: %d",bmp.biCompression);

fseek(file,34L,0);//圖像數據區的大小
fwrite(&(bmp.biSizeImage),sizeof(int),1,file);
printf("\n bmp biSizeImage: %d",bmp.biSizeImage);

fseek(file,38L,0);//水平解析度
fwrite(&(bmp.biXPelsPerMeter),sizeof(int),1,file);
printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);

fseek(file,42L,0);//垂直解析度
fwrite(&(bmp.biYPelsPerMeter),sizeof(int),1,file);
printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);

fseek(file,46L,0);//顏色索引數
fwrite(&(bmp.biClrUsed),sizeof(int),1,file);
printf("\n bmp biClrUsed: %d",bmp.biClrUsed);

fseek(file,50L,0);//重要顏色索引數
fwrite(&(bmp.biClrImportant),sizeof(int),1,file);
printf("\n bmp biClrImportant: %d\n",bmp.biClrImportant);

fseek(file,(long)(bmp.bfOffBits),0);
fwrite(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);

fclose(file);
}

//pixProcess.c文件

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include"image.h"

//灰度化
void image_gray()
{
int i,j;
unsigned char tmp;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
tmp=0.11*(*(imagedata+i*line_byte+j*3+0))+0.59*(*(imagedata+i*line_byte+j*3+1))+0.3*(*(imagedata+i*line_byte+j*3+2));
imagedata[i*line_byte+j*3+0]=tmp;
imagedata[i*line_byte+j*3+1]=tmp;
imagedata[i*line_byte+j*3+2]=tmp;
//printf("\nnidsfh%d %d",i,j);
}
}
}

//二值化

void image_binarization()
{
int i,j;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
if ((*(imagedata+i*line_byte+j))<128)
{
imagedata[i*line_byte+j]=0;
}
else
{
imagedata[i*line_byte+j]=255;
}
}
}
}

void image_opposite() //反相
{
int i,j;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
imagedata[i*line_byte+j]=abs(255-imagedata[i*line_byte+j]);
}
}
}

void image_channel() //抽取RGB通道
{
int i,j;
char rgb;
printf("\nplease enter a char(r/g/b): ");
fflush(stdin);
scanf("%c",&rgb);
if (rgb=='b')
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j+1]=0;
imagedata[i*line_byte+3*j+2]=0;
}
}
}
else if(rgb=='g')
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j]=0;
imagedata[i*line_byte+3*j+2]=0;
}
}
}
else
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j]=0;
imagedata[i*line_byte+3*j+1]=0;
}
}
}

}

void image_bright()//改變圖像亮度
{
int level;
int i,j;
printf("\n please enter the level of brightness[-255 to 255] :");
fflush(stdin);
scanf("%d",&level);
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
if (level>=0)
{

if ((imagedata[i*line_byte+j]+level)>255)
imagedata[i*line_byte+j]=255;
else
imagedata[i*line_byte+j]+=level;
}
else
{
if ((imagedata[i*line_byte+j]-abs(level))<0)
imagedata[i*line_byte+j]=0;
else
imagedata[i*line_byte+j]+=level;
}

}
}
}

//void image_create() //創建一幅24位BMP圖像文件。
//{

//main.c文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include"image.h"

BMP bmp;

int main()
{
FILE *file=NULL;
int choose;
char gono;
do
{
image_info(file); //imagedata已經分配了動態內存,但是沒有釋放

printf("\n 1.image_opposite");
printf("\n 2.image_gray");
printf("\n 3.image_binarization");
printf("\n 4.image_channel");
printf("\n 5.image_brightness");
//printf("6.image_opposite");
//printf("7.image_opposite");

printf("\nchoose your options:");
fflush(stdin);
scanf("%d",&choose);
switch(choose)
{

case 1:
image_opposite();
image_save(file);
free(imagedata);
break;
case 2:
image_gray();
image_save(file);
free(imagedata);
break;
case 3:
image_binarization();
image_save(file);
free(imagedata);
break;
case 4:
image_channel();
image_save(file);
free(imagedata);
break;
case 5:
image_bright();
image_save(file);
free(imagedata);
break;
default:
printf("\n wrong choose!");

}

printf("\nlet's go on?(y/n):");
fflush(stdin);
scanf("%c",&gono);
if (gono=='n')
{
printf("\nbye bye!");
break;
}
}
while(1);

return 0;
}

㈨ 用C語言怎麼讀取BMP格式的圖片

沒有標准函數讀。
需要根據BMP文件的結構定義,讀出頭部和每個顏色值。
struct
header
{
unsigned
short
int
bfType;
unsigned
int
bfSize;
unsigned
short
int
bfReserved1;
unsigned
short
int
bfReserved2;
unsigned
int
bfoffBits;
}__attribute__
((packed));
struct
tinfoheader
{
unsigned
int
biSize;
unsigned
int
biWidth;
unsigned
int
biHeight;
unsigned
short
int
biPlanes;
unsigned
short
int
biBitCount;
unsigned
int
biCompression;
unsigned
int
biSizeImage;
unsigned
int
biXPelsPerMeter;
unsigned
int
biYPelsPerMeter;
unsigned
int
biClrUsed;
unsigned
int
biClrImportant;
}__attribute__
((packed));

㈩ 如何用C語言讀取BMP圖像

fopen() 以b+r方式打開.bmp文件,從offset sizeof(BITMAPFILEHEADER)處,
讀取sizeof(BITMAPINFOHEADER)個byte到BITMAPINFOHEADER bih,
bih.biWidth 即是寬,bih.biHeight即是高。