本文目錄一覽:
高手指點:用C語言編寫一個讀寫“*.BMP”文件信息的程序
#ifndef BMPRW_H
#define BMPRW_H
typedef struct { // 長度12字節
// short bftype; // 固定為”BM”,VC不能讀取一個short,故省略
int bfSize; // 位圖文件的大小,以字節為單位
short bfReserved1; // 位圖文件保留字,必須為0
short bfReserved2; // 位圖文件保留字,必須為0
int bfOffBits; // 位圖數據的起始位置,以相對於位圖文件頭的偏移量表示,以字節為單位
} BITMAPFILEHEADER;
typedef struct { // 長度40字節
int biSize; // 本結構所佔用字節數,長度40字節
int biWidth; // 位圖的寬度,以像素為單位
int biHeight; // 位圖的高度,以像素為單位
short biPlanes; // 目標設備的級別,必須為1
short biBitCount; // 每個像素所需的位數,必須是1(雙色),4(16色),8(256色)或24(真彩色)之一
int biCompression; // 位圖壓縮類型,必須是0(不壓縮),1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
int biSizeImage; // 位圖的大小,以字節為單位
int biXPelsPerMeter; // 位圖水平分辨率,每米像素數
int biYPelsPerMeter; // 位圖垂直分辨率,每米像素數
int biClrUsed; // 位圖實際使用的顏色表中的顏色數
int biClrImportant; // 位圖顯示過程中重要的顏色數
} BITMAPINFOHEADER;
typedef struct { // 24位真彩色無此結構,256級灰度圖長度256*4字節
char rgbBlue; // 藍色的亮度(值範圍為0-255)
char rgbGreen; // 綠色的亮度(值範圍為0-255)
char rgbRed; // 紅色的亮度(值範圍為0-255)
char rgbReserved; // 保留,必須為0
} RGBQUAD;
void ColorBmpR(char*, unsigned char*); // 彩色bmp圖像讀
void ColorBmpW(char*, char*, unsigned char*); // 彩色bmp圖像寫
void GrayBmpR (char*, unsigned char*); // 灰度bmp圖像讀
void GrayBmpW (char*, char*, unsigned char*); // 灰度bmp圖像寫
#endif
///////////////////////////////////////////////////////////
#include “stdio.h”
#include “stdlib.h”
#include “Common.h”
#include “BmpRW.h”
/*
Copyright: Li Weiwei
VER: 2.00
Function: 讀取一幅256灰度的bmp圖片入內存
Input: bmp文件名指針,內存中圖片數據指針
Output: 無
*/
void GrayBmpR(char *fn, unsigned char *pImage)
{
BITMAPFILEHEADER *pbmpfh; // bmp文件頭指針
BITMAPINFOHEADER *pbmpi; // bmp文件信息頭指針
unsigned char *pbitstr; // bmp文件數據指針
int i = 0;
// 將bmp文件頭文件讀入*pbmpfh
FILE *rfile = fopen(fn,”rb+”);
pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER));
if (!pbmpfh)
{
printf(“pbmpfh not enough memory”);
}
fseek(rfile,sizeof(short),SEEK_SET);
fread(pbmpfh,sizeof(BITMAPFILEHEADER),1,rfile);
// 將bmp文件信息頭文件讀入*pbmpi
pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER));
if (!pbmpi)
{
printf(“pbmpi not enough memory”);
}
fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
fread(pbmpi,sizeof(BITMAPINFOHEADER),1,rfile);
// 將bmp文件數據讀入*pbitstr
pbitstr = (unsigned char*) malloc(IMAGE_SIZE);
if (!pbitstr)
{
printf(“pbitstr not enough memory”);
}
fseek(rfile,pbmpfh-bfOffBits,SEEK_SET);
fread(pbitstr,IMAGE_SIZE,1,rfile);
fclose(rfile);
// 將*pbitstr中數據存入*pImage
for (i = 0; i IMAGE_SIZE; i++)
{
*(pImage+i) = *(pbitstr+i);
}
// 釋放不用的內存空間
free(pbitstr);
free(pbmpi);
free(pbmpfh);
}
/*
Copyright: Li Weiwei
VER: 2.00
Function: 讀取一幅24位真彩色bmp圖片入內存
Input: bmp文件名指針,內存中圖片數據指針
Output: 無
*/
void ColorBmpR(char *fn, unsigned char *pImage)
{
BITMAPFILEHEADER *pbmpfh; // bmp文件頭指針
BITMAPINFOHEADER *pbmpi; // bmp文件信息頭指針
unsigned char *pbitstr; // bmp文件數據指針
int i = 0;
// 將bmp文件頭文件讀入*pbmpfh
FILE *rfile = fopen(fn,”rb+”);
pbmpfh = (BITMAPFILEHEADER*) calloc(1, sizeof(BITMAPFILEHEADER));
if (!pbmpfh)
{
printf(“pbmpfh not enough memory”);
}
fseek(rfile,sizeof(short),SEEK_SET);
fread(pbmpfh,sizeof(BITMAPFILEHEADER),1,rfile);
// 將bmp文件信息頭文件讀入*pbmpi
pbmpi = (BITMAPINFOHEADER*) calloc(1, sizeof(BITMAPINFOHEADER));
if (!pbmpi)
{
printf(“pbmpi not enough memory”);
}
fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
fread(pbmpi,sizeof(BITMAPINFOHEADER),1,rfile);
// 將bmp文件數據讀入*pbitstr
pbitstr = (unsigned char*) calloc(IMAGE_SIZE*3, sizeof(char));
if (!pbitstr)
{
printf(“pbitstr not enough memory”);
}
fseek(rfile,pbmpfh-bfOffBits,SEEK_SET);
fread(pbitstr,IMAGE_SIZE*3,1,rfile);
fclose(rfile);
// 將*pbitstr中數據存入*pImage
for( i=0 ; i IMAGE_SIZE*3 ; i++ )
{
*(pImage+i) = *(pbitstr+i);
}
// 釋放不用的內存空間
free(pbitstr);
free(pbmpi);
free(pbmpfh);
}
/*
Copyright: Li Weiwei
VER: 2.00
Function: 寫一幅256灰度的bmp圖片入文件
Input: 灰度模板文件名指針,待寫入bmp文件名指針,內存中圖片數據指針
Output: 無
*/
void GrayBmpW(char *rfn, char *wfn, unsigned char *pImage)
{
BITMAPINFOHEADER *pbmpi; // bmp文件信息頭指針
BITMAPFILEHEADER *pbmpfh; // bmp文件頭指針
RGBQUAD *pbmprgb; // bmp文件調色板指針
unsigned char *pbitstr; // bmp文件數據指針
short bmp_header = 0x4D42; // bmp文件頭字
short bmp_end = 0x0000; // bmp文件尾字
int i = 0;
FILE *rfile = fopen(rfn,”rb+”); // 模板bmp文件指針
FILE *wfile = fopen(wfn,”wb+”); // 生成bmp文件指針
// 將bmp頭字寫入文件
fseek(wfile,0,SEEK_SET);
fwrite(bmp_header,1,sizeof(short),wfile);
// 將模板bmp文件頭文件寫入生成文件
pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER));
if (!pbmpfh)
{
printf(“pbmpfh not enough memory”);
}
fseek(rfile,sizeof(short),SEEK_SET);
fread(pbmpfh,1,sizeof(BITMAPFILEHEADER),rfile);
fseek(wfile,sizeof(short),SEEK_SET);
fwrite(pbmpfh,1,sizeof(BITMAPFILEHEADER),wfile);
// 將模板bmp文件信息頭文件寫入生成文件
pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER));
if (!pbmpi)
{
printf(“pbmpi not enough memory”);
}
fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
fread(pbmpi,1,sizeof(BITMAPINFOHEADER),rfile);
fseek(wfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
fwrite(pbmpi,1,sizeof(BITMAPINFOHEADER),wfile);
// 將模板bmp調色板寫入生成文件
pbmprgb = (RGBQUAD*) calloc(256,sizeof(RGBQUAD));
if (!pbmprgb)
{
printf(“pbmprgb not enough memory”);
}
fseek(rfile,sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
fread(pbmprgb,256,sizeof(RGBQUAD),rfile);
fclose(rfile); // 關閉模板文件
fseek(wfile,sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
fwrite(pbmprgb,sizeof(RGBQUAD),256,wfile);
// 將圖像數據pImage寫入生成文件
fseek(wfile,pbmpfh-bfOffBits,SEEK_SET);
pbitstr = (unsigned char*) malloc(IMAGE_SIZE);
if (!pbitstr)
{
printf(“pbitstr not enough memory”);
}
for (i = 0; i IMAGE_SIZE; i++)
{
*(pbitstr+i)=*(pImage+i);
}
fwrite(pbitstr,IMAGE_SIZE,1,wfile);
free(pbitstr);
// 將bmp尾字寫入文件
fseek(wfile,0,SEEK_END);
fwrite(bmp_end,1,sizeof(short),wfile);
fclose(wfile); // 關閉生成文件
// 釋放不用的內存空間
free(pbmprgb);
free(pbmpi);
free(pbmpfh);
}
/*
Copyright: Li Weiwei
VER: 2.00
Function: 寫一幅24位真彩色bmp圖片入文件
Input: 24位真彩色模板文件名指針,待寫入bmp文件名指針,內存中圖片數據指針
Output: 無
*/
void ColorBmpW(char *rfn, char *wfn, unsigned char *pImage)
{
BITMAPFILEHEADER *pbmpfh; // bmp文件頭指針
BITMAPINFOHEADER *pbmpi; // bmp文件信息頭指針
unsigned char *pbitstr; // bmp文件數據指針
short bmp_header = 0x4D42; // bmp文件頭字
int i = 0;
FILE *rfile = fopen(rfn,”rb+”); // 模板bmp文件指針
FILE *wfile = fopen(wfn,”wb+”); // 生成bmp文件指針
// 將bmp頭字寫入文件
fseek(wfile, 0, SEEK_SET);
fwrite(bmp_header,1,sizeof(short),wfile);
// 將模板bmp文件頭文件寫入生成文件
pbmpfh = (BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER));
if (!pbmpfh)
{
printf(“not enough memory”);
}
fseek(rfile,sizeof(short),SEEK_SET);
fread(pbmpfh,1,sizeof(BITMAPFILEHEADER),rfile);
fseek(rfile,sizeof(short),SEEK_SET);
fwrite(pbmpfh,1,sizeof(BITMAPFILEHEADER),wfile);
// 將模板bmp文件信息頭文件寫入生成文件
pbmpi = (BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER));
if (!pbmpi)
{
printf(“not enough memory”);
}
fseek(rfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
fread(pbmpi,1,sizeof(BITMAPINFOHEADER),rfile);
fseek(wfile,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
fwrite(pbmpi,1,sizeof(BITMAPINFOHEADER),wfile);
// 將圖像數據寫入生成文件
pbitstr = (unsigned char*) calloc(IMAGE_SIZE*3,sizeof(char));
if (!pbitstr)
{
printf(“not enough memory”);
}
// 將*pImage中數據寫入*pbitstr
for( i=0 ; i IMAGE_SIZE*3 ; i++ )
{
*(pbitstr+i) = *(pImage+i);
}
fseek(wfile,pbmpfh-bfOffBits,SEEK_SET);
fwrite(pbitstr,IMAGE_SIZE*3,1,wfile);
fclose(wfile);
// 釋放不用的內存空間
free(pbitstr);
free(pbmpi);
free(pbmpfh);
}
關於C語言讀取8位BMP
fread((char*)bmpPla,sizeof(RGBQUAD),NumColors,fp);
這句有問題,RGBQUAD bmpPla[256]; 本身bmpPla就是個地址(數組變量就是首地址),所以我覺得你改為如下看看是否正確:
fread((char*)bmpPla,sizeof(RGBQUAD),NumColors,fp);
用C語言讀取8bit灰度bmp檔
bmp格式的圖像文件,存放像素格式的方式是從左下角開始,行序存儲.
若要實現上下翻轉,把像素格式數據按行進行倒排就行了.
涉及的內容有:bmp文件格式(8bit),二進制文件的讀寫.
附一張1bit灰度的文本解析圖:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/198792.html