1. 程式人生 > >用C++語言寫bmp檔案的程式完整版

用C++語言寫bmp檔案的程式完整版

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

/* 定義WORD為兩個位元組的型別 */
typedef unsigned short WORD;
/* 定義DWORD為四個位元組的型別 */
typedef unsigned long DWORD;

/* 點陣圖檔案頭主要是對點陣圖檔案的一些描述 點陣圖資訊頭主要是對點陣圖影象方面資訊的描述 */
/*************************** 點陣圖標準資訊(54位元組) ******************************************/
/* 點陣圖檔案頭 (點陣圖頭的位元組數 = 點陣圖檔案位元組數 - 點陣圖影象資料位元組數)*/
/* MBP影象資料 (影象資料位元組數 = 影象寬度*影象高度*(每個畫素的位數/8))*/
typedef struct BMP_FILE_HEADER
{
	WORD bType;      // 檔案識別符號 
	DWORD bSize;     // 檔案的大小 
	WORD bReserved1; // 保留值,必須設定為0  
	WORD bReserved2; // 保留值,必須設定為0 
	DWORD bOffset;   // 檔案頭的最後到影象資料位開始的偏移量 
} BMPFILEHEADER;     // 14 位元組

/* 點陣圖資訊頭 */
typedef struct BMP_INFO
{
	DWORD bInfoSize;            // 資訊頭的大小   
	DWORD bWidth;               // 影象的寬度     
	DWORD bHeight;              // 影象的高度     
	WORD bPlanes;               // 影象的位面數   
	WORD bBitCount;             // 每個畫素的位數 
	DWORD bCompression;         // 壓縮型別 
	DWORD bmpImageSize;         // 影象的大小,以位元組為單位 
	DWORD bXPelsPerMeter;       // 水平解析度 
	DWORD bYPelsPerMeter;       // 垂直解析度 
	DWORD bClrUsed;             // 使用的色彩數 
	DWORD bClrImportant;        // 重要的顏色數 
} BMPINF;            // 40 位元組

/* 彩色表:調色盤 */
typedef struct RGB_QUAD 
{
	char rgbBlue;     // 藍色強度 
	char rgbGreen;    // 綠色強度 
	char rgbRed;      // 紅色強度 
} RGBQUAD;


int main()
{
	int count = sizeof(BMPFILEHEADER);
	FILE *fp;                     // 定義一個檔案指標
	BMPFILEHEADER bmpFileHeader;  // 定義一個 BMP 檔案頭的結構體
	BMPINF bmpInfo;               // 定義一個 BMP 檔案資訊結構體 


	// "wb" 以二進位制形式寫入檔案,只允許讀資料。'b'指的是讓這個庫函式以二進位制形式開啟此檔案。
	// 讀取失敗會返回空指標,讀取成功後,fp 會指向一塊具有 bmp 屬性的記憶體,我們可以對這塊記憶體開始操作
	// 沒有的話自動建立該檔案
	if((fp = fopen("kilyc.bmp", "wb")) == NULL) 
	{
		printf("Cann't open the file!\n");
		return 0;
	}
	
	
	bmpInfo.bInfoSize = 40;
	bmpInfo.bHeight = 300;
	bmpInfo.bWidth = 300;
	bmpInfo.bBitCount = 24;
	bmpInfo.bmpImageSize = bmpInfo.bHeight*bmpInfo.bWidth*bmpInfo.bBitCount/8;
	bmpInfo.bCompression = 0;
	bmpInfo.bClrImportant = 0;
	bmpInfo.bClrUsed = 0;
	bmpInfo.bXPelsPerMeter = 0;
	bmpInfo.bYPelsPerMeter = 0;
	bmpInfo.bPlanes = 1; // 調色盤數量

	bmpFileHeader.bType = 0x4D42;
	bmpFileHeader.bOffset = 54;
	bmpFileHeader.bSize = bmpInfo.bmpImageSize + bmpFileHeader.bOffset;
	bmpFileHeader.bReserved1 = 0;
	bmpFileHeader.bReserved2 = 0;
	
	RGBQUAD image[300][300];
	
	for(int i=0; i<bmpInfo.bWidth; i++)
		for(int j=0; j<bmpInfo.bHeight; j++)
		{
			image[i][j].rgbBlue = 0;
			image[i][j].rgbGreen = 0;
			image[i][j].rgbRed = 255;
		}

	// 讓 fp 指向 bmp 檔案的開始 
	// 第 2 個引數是偏移量 第三個引數是檔案起始地址 所以此函式執行成功後文件指標會指向檔案的開始
	fseek(fp, 0, SEEK_SET);                            // fp = 0x00426aa0



	// 寫入檔案
	fwrite(&bmpFileHeader, sizeof(bmpFileHeader), 1, fp);
	fwrite(&bmpInfo, sizeof(bmpInfo), 1, fp);
	fwrite(image, sizeof(RGBQUAD), bmpInfo.bHeight*bmpInfo.bWidth, fp);



	// 看是否是 1 個位元組對齊
	printf("sizeof(bmpFileHeader) = %d\n", sizeof(bmpFileHeader));
	printf("sizeof(bmpInfo) = %d\n", sizeof(bmpInfo));
	printf("sizeof(RGBQUAD)*bmpInfo.bHeight*bmpInfo.bWidth = %d\n\n", sizeof(RGBQUAD)*bmpInfo.bHeight*bmpInfo.bWidth);

	// 輸出BMP檔案的點陣圖檔案頭的所有資訊
	printf("點陣圖檔案頭主要是對點陣圖檔案的一些描述:BMPFileHeader\n\n");
	printf("檔案識別符號 = 0X%X\n", bmpFileHeader.bType);
	printf("BMP 檔案大小 = %d 位元組\n", bmpFileHeader.bSize);
	printf("保留值1 = %d \n", bmpFileHeader.bReserved1);
	printf("保留值2 = %d \n", bmpFileHeader.bReserved2);
	printf("檔案頭的最後到影象資料位開始的偏移量 = %d 位元組\n", bmpFileHeader.bOffset);

	// 輸出BMP檔案的點陣圖資訊頭的所有資訊
	printf("\n\n點陣圖資訊頭主要是對點陣圖影象方面資訊的描述:BMPInfo\n\n");
	printf("資訊頭的大小 = %d 位元組\n", bmpInfo.bInfoSize);
	printf("點陣圖的高度 = %d \n", bmpInfo.bHeight);
	printf("點陣圖的寬度 = %d \n", bmpInfo.bWidth);
	printf("影象的位面數(位面數是調色盤的數量,預設為1個調色盤) = %d \n", bmpInfo.bPlanes); 
	printf("每個畫素的位數 = %d 位\n", bmpInfo.bBitCount);
	printf("壓縮型別 = %d \n", bmpInfo.bCompression);
	printf("影象的大小 = %d 位元組\n", bmpInfo.bmpImageSize);
	printf("水平解析度 = %d \n", bmpInfo.bXPelsPerMeter);
	printf("垂直解析度 = %d \n", bmpInfo.bYPelsPerMeter);
	printf("使用的色彩數 = %d \n", bmpInfo.bClrUsed);
	printf("重要的色彩數 = %d \n", bmpInfo.bClrImportant);

	printf("\n\n\n壓縮說明:有0(不壓縮),1(RLE 8,8位RLE壓縮),2(RLE 4,4位RLE壓縮,3(Bitfields,位域存放)");

	fclose(fp);

	while(1);

	return 0;

}

相關推薦

C++語言bmp檔案程式整版

#include <stdio.h> #include <stdlib.h> /* 定義WORD為兩個位元組的型別 */ typedef unsigned short WORD; /* 定義DWORD為四個位元組的型別 */ typedef uns

C語言一個掃雷程式

執行環境:win10   vs2013       本程式所有設計思路均已註釋行為標記在程式中,為了方便起見,將不在部落格中進行書寫,想要學的朋友複製下面的原始碼可進行學習,也可將程式進行修改獲取不同的遊戲體驗 程式原始截圖 執行結果:

lighttpd + CGI,c語言cgi程式

相信大家都想過用瀏覽器來執行c語言程式,比如點電路板上的燈、其他控制功能等。這裡我就說一說心得。 要使用瀏覽器就必須有伺服器,我這裡用了lighttpd。因為我看其他的都停止開發了,沒法用。 配置和測試可以參考這篇文章: http://blog.chinaunix.net/u

C語言一個好玩的寶石一樣的圖像

循環圖像圖形#include<stdio.h>main(){int n;scanf("%d",&n); for(int i=0;i<n;i++) { for(int j=0;j<n-i-1;j++) { printf(" ")

怎麽C語言一個飛機程序

sge 怎麽 das mob gpl hdd ref dhx cte 5zeffurgal誥退俁稼犢爍厝擋傅鼓《http://weibo.com/p/230927987816857564094464》 wv8kbiqhdd壁溉斡吠戎琴痛鋼匙谷《http://weibo.c

自己C語言RL78 serial bootloader

      瞭解更多關於bootloader 的C語言實現,請加我QQ: 1273623966 (驗證資訊請填 bootloader),歡迎諮詢或定製bootloader(線上升級程式)。   之前用C實現過多款PIC微控制器的bootloader, 包括8-bit的PIC16,PIC18;16-bit的P

懶癌晚期學圖論的時候自己C語言了個求可達性矩陣的演算法~

可達性矩陣演算法~ 直接上程式碼 #include <iostream> #include <cstring> using namespace std; #define n 5 void print(int a[n][n]); void print1(int a[n][n]); v

C語言一個簡單的三子棋,實現玩家與電腦的對戰

原始碼: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 寫一個三子棋 */ //邏輯: //1. 畫

C語言一個簡單的掃雷小遊戲

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 語言寫一個簡單的掃雷遊戲 */ // 1.寫一個遊戲選單 M

C語言PL0編譯器

#include<stdio.h> /*#include"pl0.h"*/ #include"string.h" #include <windows.h> /*PL/0編譯系統C版本標頭檔案pl0.h*/ /*typedef enum{false,t

C語言的一個順序表實現圖書館書籍管理

Function: 增add_book() 刪delete_book() 改modify_book() 查check_book() 實現吧! **************************/ #include<stdio.h>//裡

C語言讀取BMP檔案(同時支援Linux和Windows)

C語言讀取BMP檔案最關鍵的是要理解結構體對齊。一般情況下,C語言的結構體在記憶體中會按照4位元組(32位)或者8位元組(64位)對齊。BMP檔案的資料頭結構體按照位元組排列,而且不能對齊,所以需要用預編譯巨集設定不能對齊。 另外注意Linux下一般用UTF-8編碼,但是Windows下用GB2

C語言一個數組,實現類似JAVA語言中ArrayList的功能

此程式是在看過郝斌老師的資料結構與演算法的視訊後,自己用C語言實現的。整個程式比較簡單,適合入門資料結構時練手。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #

高階語言是高階程式設計師低階語言給初級程式設計師的工具?

讀《開源時代》創刊詞----- 《開源時代》今天創刊,這是 ChinaUnix 社群為廣大會員提供的一個新的服務。以時代命名,又承載著一種期許,一種為這個時代這個社會以盡微薄之力的期許。“開源”現在已經成了熱門詞彙了,然而在談論中國開源現狀的時候,幾乎所有人都帶著一種近乎悲涼

基於Huffman編碼的C語言解壓縮檔案程式

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> //極大值用於生成Huffman樹 #define MA

C++語言遊戲——打飛機

想玩遊戲嗎? 就到某位神犇這來吧! 這會告訴你很多遊戲寫法! 今天,神犇就開始書寫第三期——打飛機!!! 很容易,只需要用腦袋想想即可,READY——GO! 我也希望大家多多捧場哦~~~ #include<iostream> #include<

C++語言遊戲——打怪小遊戲

想玩遊戲嗎? 就到某位神犇這來吧! 這會告訴你很多遊戲寫法! 今天,神犇就開始書寫第二期——打怪小遊戲!!! 很容易,只需要用腦袋想想即可,READY——GO! 我也希望大家多多捧場哦~~~ 有一點點BUG,敬請諒解! #include <iostre

C函式指標妙c語言一個簡易類

其實在C++中的物件也並不是實現起來也並不是多麼的什麼神祕,只是編譯器幫我們做了許多工作,所以我們總覺得C++要比c語言難一些,C++編譯器其實對於類中的非Virtual 函式的的呼叫規則與對C編譯器對函式的呼叫時一樣的,那就是通過call 函式地址的方法。等有

基於C語言BMP檔案格式轉換

//將bmp圖片檔案保存於1.bmp中,若圖片是bmp檔案,則在out.bmp檔案中可以看到,若不是,則在out.bmp中顯示開啟失敗。//識別乒乓球#include<stdio.h>#include<stdlib.h>//此bmp檔案影象深度要求24

C語言的一個最短作業優先排程演算法

#include <stdio.h> //定義一個結構體 struct sjf{ char name[10]; //程序名 float arrivetime; //到達時間 float servicetime;//服務時間 float starttime; //開