當前位置:首頁 » 編程語言 » c語言讀取bmp

c語言讀取bmp

發布時間: 2022-09-27 20:15:28

㈠ 文件在c語言中怎麼樣把一個.bmp文件讀入內存中

以rb模式打開

seek到文件結尾 通過ftell獲取文件大小

申請該大小的內存

再定位文件指針到文件開頭

以fread讀文件所有數據到內存中。

代碼:

unsignedchar*load_bmp(constchar*file,int*len)
{
unsignedchar*p;
intl;
FILE*fp;
*len=0;
fp=fopen(file,"rb");
if(fp==NULL)
returnNULL;
fseek(fp,0,SEEK_END);
l=ftell(fp);
rewind(fp);
p=(unsignedchar*)malloc(l);
if(p)
{
fread(p,1,l,fp);
*len=l;
}
fclose(fp);
returnp;
}

㈡ c語言讀取BMP圖像

你是自己定義的BMP圖像,還是標準的BMP文件?
標準的BMP文件 開始有BITMAPFILEHEADER,
後面的 RGB 還有 4 bytes 對齊補0 問題。
比較復雜。

㈢ 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格式的圖片中讀取圖片的灰度值

  • 方法一:

  • #include<stdio.h>
    #include<stdlib.h>
    voidmain()
    {
    inti,j;
    FILE*fp;//指向文件的指針
    fp=fopen("Lena.raw","rb");//打開文件。注意raw格式圖像要以只讀二進制流的形式打開
    if(!fp)
    {
    printf("ERROR! ");
    }
    unsignedchar*pData=newunsignedchar[256*256];//注意:raw圖像用無符號char型讀入
    fread(pData,sizeof(unsignedchar),(256*256),fp);//fread具體用法見msdn
    fclose(fp);//取消fp指針指向
    intvalue[256]={0};//聲明並初始化存灰度值的數組
    for(i=0;i<(256*256);i++)//統計灰度值
    {
    value[pData[i]]++;
    }
    printf("灰度值 大小");//
    printf(" ");
    fp=fopen("result.txt","wb");
    fprintf(fp,"灰度值 大小 ");//注意 否則不能換行!
    for(j=0;j<256;j++)//將結果輸出到txt中
    {
    printf("%d %d ",j,value[j]);
    //fwrite(value,sizeof(int),256,fp);
    fprintf(fp,"%d %d ",j,value[j]);//注意 否則不能換行
    }
    delete[]pData;//刪除空間
    fclose(fp);//關閉txt文件
    }
  • 方法二:

  • #include<stdio.h>
    #include<stdlib.h>
    intvalue[256]={0};


    intfread(unsignedchar*pData)//把聲明的那個數組空間指針作為參數來回傳
    {
    FILE*fp;
    fp=fopen("Lena.raw","rb");
    if(!fp)
    {
    printf("ReadERROR! ");
    }
    fread(pData,sizeof(unsignedchar),(256*256),fp);
    fclose(fp);
    return0;//
    }
    intfchuli(unsignedchar*pData)
    {
    for(inti=0;i<(256*256);i++)//統計灰度值
    {
    value[pData[i]]++;
    }
    return0;//


    }
    intfwrite(unsignedchar*pData)
    {
    FILE*fp;
    fp=fopen("result.txt","wb");
    fprintf(fp,"灰度值 大小 ");


    for(intj=0;j<256;j++)//將結果輸出到txt中
    {
    printf("%d %d ",j,value[j]);
    //fwrite(value,sizeof(int),256,fp);
    fprintf(fp,"%d %d ",j,value[j]);
    }


    delete[]pData;//刪除空間
    fclose(fp);//關閉txt文件
    returnvalue[256];//


    }
    intmain(unsignedchar*pData)
    {
    pData=newunsignedchar[256*256];//在主函數里聲明新空間


    fread(pData);//傳數組地址
    fchuli(pData);
    fwrite(pData);
    return0;


    }

㈤ 如何用C語言程序從bmp格式的圖片中讀取圖片的灰度值

1、首先要了解bmp點陣圖的格式,搜索些技術支持文檔,bmp點陣圖基本上是分4大部分,文件信息結果部分,文件頭信息結果部分,調色板結果部分,後面就是數據實體部分。及其每個部分對應有用的信息。比如長寬。當然長寬信息你自己可以從window系統下看得到。打開bmp文件,把前面三部分的位元組總數給固定下來,逐個字元讀取,然後讀取數據實體部分,輸出就可以了。
2、常式:

#include<stdio.h>
#include<stdlib.h>
#pragmapack(2)
/*定義WORD為兩個位元組的類型*/
typedefunsignedshortWORD;
/*定義DWORD為e四個位元組的類型*/
typedefunsignedlongDWORD;
/*點陣圖文件頭*/
typedefstructBMP_FILE_HEADER
{
WORDbType;/*文件標識符*/
DWORDbSize;/*文件的大小*/
WORDbReserved1;/*保留值,必須設置為0*/
WORDbReserved2;/*保留值,必須設置為0*/
DWORDbOffset;/*文件頭的最後到圖像數據位開始的偏移量*/
}BMPFILEHEADER;
/*點陣圖信息頭*/
typedefstructBMP_INFO
{
DWORDbInfoSize;/*信息頭的大小*/
DWORDbWidth;/*圖像的寬度*/
DWORDbHeight;/*圖像的高度*/
WORDbPlanes;/*圖像的位面數*/
WORDbBitCount;/*每個像素的位數*/
DWORDbCompression;/*壓縮類型*/
DWORDbmpImageSize;/*圖像的大小,以位元組為單位*/
DWORDbXPelsPerMeter;/*水平解析度*/
DWORDbYPelsPerMeter;/*垂直解析度*/
DWORDbClrUsed;/*使用的色彩數*/
DWORDbClrImportant;/*重要的顏色數*/
}BMPINF;
/*彩色表*/
typedefstructRGB_QUAD
{
WORDrgbBlue;/*藍色強度*/
WORDrgbGreen;/*綠色強度*/
WORDrgbRed;/*紅色強度*/
WORDrgbReversed;/*保留值*/
}RGBQUAD;
intmain()
{
FILE*fp;
BMPFILEHEADERfileHeader;
BMPINFinfoHeader;
longoffset,bmpImageSize,width,height,bytesPerPixel,size,bitCount;
//inti,j;
//unsignedchar**p;
WORDc;
if((fp=fopen("5.bmp","rb"))==NULL)
{
printf("Cann'topenthefile! ");
exit(0);
}
fseek(fp,0,0);
fread(&fileHeader,sizeof(fileHeader),1,fp);
fread(&infoHeader,sizeof(infoHeader),1,fp);
//計算並輸出點陣圖數據的偏移量,圖像的大小,寬度和高度,每個像素點所佔的位元組
size=fileHeader.bSize;
offset=fileHeader.bOffset;
bmpImageSize=infoHeader.bmpImageSize;
width=infoHeader.bWidth;
height=infoHeader.bHeight;
bitCount=infoHeader.bBitCount;
bytesPerPixel=infoHeader.bBitCount/8;
printf("%d%d%d%d%d%d ",size,offset,bmpImageSize,width,height,bitCount,bytesPerPixel);
//輸出每個像素點所佔位元組中的內容
c=fgetc(fp);
while(!feof(fp))
{
printf("%x",c);
c=fgetc(fp);
}
printf(" ");
fclose(fp);
return0;
}

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

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

㈦ 讀bmp圖片:頭文件為66位元組。。。怎麼用c語言來讀取數據啊,網上的代碼我看不懂。新手,希望能寫明白些

/* 單色BMP圖形文件顯示 */

#include "graphics.h"
#include<stdio.h>
#include<conio.h>
/* BMP 文件頭部結構 */
struct header
{
unsigned int bfType;
long bfSize;
unsigned int bfReserved1;
unsigned int bfReserved2;
long bfoffBits;
};

struct tinfoheader
{
long biSize;
long biWidth;
long biHeight;
unsigned int biPlanes;
unsigned int biBitCount;
long biCompression;
long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
long biClrUsed;
long biClrImportant;
};
struct header HEADER;
struct tinfoheader INFO;

unsigned char dgbuff[10000];/* 黑白圖形文件大小,不能超過 */

void LoadDZ()
{
int i,ld;
char filename[20]={"1.bmp"};/*假設在當前目錄下1.bmp文件 */
FILE *fp;

fp=fopen(filename,"rb");
fseek(fp,0,SEEK_SET);
fseek(fp,0,SEEK_END);
ld=ftell(fp);
fclose(fp);
fp=fopen(filename,"rb");
if(fp!=NULL)
{
fread(&dgbuff,ld,1,fp);
fclose(fp);
}
fp=fopen(filename,"rt");
if(fp!=NULL)
{
fread(&HEADER, sizeof(struct header), 1, fp);
fread(&INFO, sizeof(struct tinfoheader), 1, fp);
fclose(fp);
}
}

void show(int x,int y,int giColor,int backColor)/* 顯示位置、前景色、背景色 */
{
int i,j,k,l=0,num,m,x0,x1,x2;
unsigned char b,c,c1;

if(HEADER.bfType!=0x4d42 || HEADER.bfReserved1!=0 || INFO.biSizeImage==0
|| INFO.biPlanes!=1 || INFO.biBitCount!=1 || INFO.biCompression!=0)
return;

m=INFO.biWidth/32;
if((INFO.biWidth%32)!=0) m=m+1;
num=HEADER.bfoffBits;

for(l=INFO.biHeight-1; l>=0; l--)
{
for (i=0;i<m;i++)
{
x0=i<<5;
for (j=0;j<4;j++)
{
x1=j<<3;
c=dgbuff[num];
num++;
for (k=7;k>=0;k--)
{
x2=x0+x1+7-k;
if(x2>=INFO.biWidth) continue;
else
{
b=1<<k;
c1=c&b;
if(c1==0)
{
putpixel(x+x2,y+l,giColor);
}
else
putpixel(x+x2,y+l,backColor);
}
}
}
}
}
}

void main()
{
int driver,mode;

driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,"");
setfillstyle(SOLID_FILL,WHITE);
bar(0,0,639,479);
LoadDZ();
show(200,200,RED,BLACK);
getch();
closegraph();
}

㈧ 關於C語言讀取8位BMP

fread((char*)&bmpPla,sizeof(RGBQUAD),NumColors,fp);
這句有問題,RGBQUAD bmpPla[256]; 本身bmpPla就是個地址(數組變數就是首地址),所以我覺得你改為如下看看是否正確:
fread((char*)bmpPla,sizeof(RGBQUAD),NumColors,fp);

㈨ C語言讀取1位的BMP圖

位深為1的bmp圖,一般是有要有顏色表的,沒有時用黑白色代替。
數據保存是1位為一個像素點。
要使用左移位右移位運算。
比如讀出一個位元組
a
byte p = (a>>7);//就是第一個像素點的顏色索引。再顏色表中找出對應的顏色就行了。
p=((a<<1)>>6);//這就是第二個像素點了.
同理可以得到其他的像素點

熱點內容
白雜訊加密 發布:2024-12-26 20:31:02 瀏覽:637
怎麼防止電腦刪除腳本 發布:2024-12-26 20:19:19 瀏覽:149
輸入伺服器或許可證文件怎麼輸 發布:2024-12-26 20:10:40 瀏覽:159
pythonarcgis 發布:2024-12-26 20:09:48 瀏覽:698
python初始化變數 發布:2024-12-26 20:05:27 瀏覽:178
win10清理緩存文件 發布:2024-12-26 20:04:50 瀏覽:360
登微信手機號填了密碼是什麼意思 發布:2024-12-26 19:40:16 瀏覽:248
蘋果電腦連接不了伺服器 發布:2024-12-26 19:07:18 瀏覽:116
傳奇裝備提示腳本 發布:2024-12-26 19:06:31 瀏覽:672
區域網dns伺服器地址 發布:2024-12-26 18:58:42 瀏覽:993