c語言寫入8位bmp,c語言輸出10位數

本文目錄一覽:

高手指點:用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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 10:27
下一篇 2024-12-04 10:27

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論