1. 程式人生 > >將RGB資料寫入BMP點陣圖檔案

將RGB資料寫入BMP點陣圖檔案

<span style="font-size:18px;">CFile file;                             //定義一個檔案物件  
	_ASSERTE(file.Open(CString("E:\\94.bmp"), CFile::modeRead));//開啟檔案  
	DWORD  dwLen = file.GetLength();                    //獲取檔案長度  
	file.Seek(54, CFile::begin);     //略過點陣圖檔案頭、資訊頭 ,為什麼是54,往下看
	buffer = new BYTE[dwLen - 54];   //為緩衝區分配空間  
	file.Read(buffer, dwLen - 54);
	//(整個點陣圖由檔案頭、資訊頭、調色盤、顏色表這四部分組合構成
	typedef long LONG;
	typedef unsigned long DWORD;
	typedef unsigned short WORD;
#pragma pack (push ,1)//由於4位元組對齊,而資訊頭大小為54位元組,第一部分14位元組,
	//第二部分40位元組,所以會將第一部分補齊為16自己,直接用sizeof,開啟圖片時就會
	//遇到premature end-of-file encountered錯誤
	typedef struct {//點陣圖檔案頭,14位元組
		WORD      bfType;   //  指定檔案型別,必須是0x424D,即字串“BM”,也就是說所有.bmp檔案的頭兩個位元組都是“BM”。
		DWORD   bfSize;   //   點陣圖檔案的大小,包括這14個位元組,以位元組為單位  
		WORD      bfReserved1;   //   點陣圖檔案保留字,必須為0
		WORD      bfReserved2;   //   點陣圖檔案保留字,必須為0
		DWORD   bfOffBits;   //   點陣圖資料的起始位置,以相對於點陣圖, 檔案頭的偏移量表示,以位元組為單位
	} BMPFILEHEADER_T;
#pragma pack (pop)
	typedef struct{//這個結構的長度是固定的,為40個位元組,可以自己算一下,DWORD、LONG4個位元組,WORD兩個位元組
		DWORD      biSize;//指定這個結構的長度,為40
		LONG       biWidth;//指定圖象的寬度,單位是象素。
		LONG       biHeight;//指定圖象的高度,單位是象素。
		WORD       biPlanes;//必須是1,不用考慮。
		WORD       biBitCount;/*指定表示顏色時要用到的位數,常用的值為1(黑白二色圖), 4(16色圖),
							  8(256色), 24(真彩色圖)(新的.bmp格式支援32位色,這裡就不做討論了)。*/
		DWORD      biCompression;/*指定點陣圖是否壓縮,有效的值為BI_RGB,BI_RLE8,BI_RLE4,
								 BI_BITFIELDS(都是一些Windows定義好的常量)。要說明的是,
								 Windows點陣圖可以採用RLE4,和RLE8的壓縮格式,但用的不多。
								 我們今後所討論的只有第一種不壓縮的情況,即biCompression為BI_RGB的情況。*/
		DWORD      biSizeImage;/*指定實際的點陣圖資料佔用的位元組數,其實也可以從以下的公式中計算出來:
biSizeImage=biWidth’ × biHeight
要注意的是:上述公式中的biWidth’必須是4的整倍數(所以不是biWidth,而是biWidth’,
表示大於或等於biWidth的,最接近4的整倍數。舉個例子,如果biWidth=240,則biWidth’=240;
如果biWidth=241,biWidth’=244)。如果biCompression為BI_RGB,則該項可能為零*/
		LONG       biXPelsPerMeter;//指定目標裝置的水平解析度,單位是每米的象素個數
		LONG       biYPelsPerMeter;//指定目標裝置的垂直解析度,單位同上。
		DWORD      biClrUsed;//指定本圖象實際用到的顏色數,如果該值為零,則用到的顏色數為2的biBitCount指數次冪
		DWORD      biClrImportant;//指定本圖象中重要的顏色數,如果該值為零,則認為所有的顏色都是重要的。
	} BMPINFOHEADER_T;

	char * bmp_file = "fuck you.bmp";//要儲存的bmp檔名,字尾不要忘了
	//int width = cx.GetWidth();影象寬高,已知
	//int height = cx.GetHeight();
	int datalen = width*height * 3 * sizeof(char); // 每個畫素點3個位元組  
	//_ASSERTE(l == size);
	// 點陣圖第一部分,檔案資訊  
	BMPFILEHEADER_T bfh;
	int dw = sizeof(DWORD);
	int ww = sizeof(WORD);
	int kk = sizeof(BMPFILEHEADER_T);//14,不對齊的話會得到16,這樣建立的BMP打不開
	int nn = sizeof(BMPINFOHEADER_T);// second section size
	bfh.bfType = (WORD)0x4d42;  //bm  
	bfh.bfSize = datalen + kk+ nn;
	bfh.bfReserved1 = 0; // reserved  
	bfh.bfReserved2 = 0; // reserved  
	bfh.bfOffBits = sizeof(BMPFILEHEADER_T) + sizeof(BMPINFOHEADER_T);//真正的資料的位置  

	// 點陣圖第二部分,資料資訊  
	BMPINFOHEADER_T bih;
	bih.biSize = sizeof(BMPINFOHEADER_T);
	bih.biWidth = width;
	bih.biHeight = height;//有時你得到的RGB資料是從點陣圖最後一個點開始掃描,直接寫入得到的圖片是倒著的,這時用-height,這樣圖片就正了  
	bih.biPlanes = 1;//為1,不用改  
	bih.biBitCount = 24;
	bih.biCompression = 0;//不壓縮  
	bih.biSizeImage = datalen;
	bih.biXPelsPerMeter = 0;//2835;//畫素每米  
	bih.biYPelsPerMeter = 0;//2835;
	bih.biClrUsed = 0;//已用過的顏色,24位的為0  
	bih.biClrImportant = 0;//每個畫素都重要  
	FILE * fp = fopen(bmp_file, "wb");//建立bmp檔案
	if (!fp) 
		return-1;

	fwrite(&bfh, 8, 1, fp);//由於linux上4位元組對齊,而資訊頭大小為54位元組,第一部分14位元組,第二部分40位元組,所以會將第一部分補齊為16自己,直接用sizeof,開啟圖片時就會遇到premature end-of-file encountered錯誤  
	fwrite(&bfh.bfReserved2, sizeof(bfh.bfReserved2), 1, fp);
	fwrite(&bfh.bfOffBits, sizeof(bfh.bfOffBits), 1, fp);
	fwrite(&bih, sizeof(BMPINFOHEADER_T), 1, fp);
	//寫入rgb資料
	fwrite(buffer, datalen, 1, fp);
	fclose(fp);
	delete[]buffer;</span>

相關推薦

RGB資料寫入BMP點陣檔案

<span style="font-size:18px;">CFile file; //定義一個檔案物件 _ASSERTE(file.Open(CString("E:\\94.bmp"), CFi

bmp點陣檔案:讀取、寫入、24位真彩轉8位灰度、灰度的二值化

影象的二值化處理就是講影象上的點的灰度置為0或255,也就是講整個影象呈現出明顯的黑白效果。即將256個亮度等級的灰度影象通過適當的閥值選取而獲得仍然可以反映影象整體和區域性特徵的二值化影象。在數字影象處理中,二值影象佔有非常重要的地位,特別是在實用的影象處理中,以二值影象處理實現而構成的系統是很多的,要進行

VC用ADO存取顯示jpg/bmp點陣檔案

 週六和今天兩天的時間,把資料庫關於圖片的儲存和顯示 實現了,雖然時間有點長,但是還是實現了。以下是網上找到的資料,很有用。 第一步:首先是要開啟一個位圖檔案,這裡使用的控制元件用Picture控制元件,就是控制元件圖示右邊最上面那個,改ID號為IDC_PICTURE,然

列表資料寫入檔案(python)檔案:txt,csv,excel

本篇為轉載,作為記錄學習用的,原作者如下:   作者:記不清下一秒  來源:CSDN  原文:https://blog.csdn.net/u010513327/article/details/80889846    以下是原文內容:

vs2005 資料寫入檔案 時發生錯誤 --“儲存空間不足,無法完成此操作

1, xp使用者:   開啟c:\boot.ini (它是隱藏的,只讀的), 開啟3G記憶體支援開關 [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(2)\WINNT [operating

資料結構:點陣法(bitmap||BMP

一、定義        點陣圖法就是bitmap的縮寫。所謂bitmap,就是用每一位來存放某種狀態,適用於大規模資料,但資料狀態又不是很多的情況。通常是用來判斷某個資料存不存在的。在STL中有一個bitset容器,引用bitset介紹: A bitset is a spe

用MATLAB矩陣資料寫入txt檔案中,開啟亂碼原因

MATLAB將資料寫入txt檔案中亂碼的原因,是將資料按照二進位制檔案寫入txt檔案,所以開啟會出現亂碼的情況,只需要把 fid1=fopen('piture.txt','w'); 換成,就可以了

資料結構】點陣與布隆處理器

文章目錄 1.點陣圖的實現 BitMap.h BitMap.c 2.布隆的實現 BloomFilter.h BloomFilter.c 1.點陣圖

Django中通過指令碼的方式json資料寫入資料庫

      這裡記錄一下django中通過指令碼的方式寫入json資料的一些技巧。       通過指令碼不僅可以將已有的json資料寫入資料庫,而且可以批量地模擬一些後臺資料,方便進行頁面的展示。    

yuv與rgb資料流寫成jpeg檔案模板

YUV轉圖片如果偏藍色,則證明是nv12,nv12 與nv21的資料反了生成的圖片與rgb與bgr反了效果一樣。 YUV生成檔案圖片 private void toJPG(byte[] bytes, int nWidth, int nHeigh) {

dataset 資料寫入資料庫

DataSet ds = new DataSet();//至於ds裡面的資料怎麼來的我就不寫了!這裡要注意一下,ds裡的Table結構一定要整利索嘍!就是千萬跟要插的那個表結構一樣! SqlConnection sc = new SqlConnection("資料庫連線字串"

1.2為多變數資料繪製散點陣

1 # 繪出6個圖形,包括了以下幾個列:花萼長度、花萼寬度、花瓣長度和花瓣寬度 2 plt.close('all') # 關掉其他的影象 3 plt.figure(1) 4 5 # 繪製一個3行2列的圖 6 subplot_start = 321 7 col_numbers = r

QT影象資料寫入txt文件

//開啟txt檔案,並將影象資料存入txt中 QFile file("ImgGray_FOD_00743_src.txt"); if(!file.open(QIODevice::WriteOnly | QIODevice::Text|QIODevice::Append))

資料結構】點陣BitMap與布隆過濾器BloomFilter

  首先先看一下下面這個騰訊的面試題:給40億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中。 【騰訊】思路一:  最容易想到的解法就是遍歷所有的40多億個整數,然後一個一個判斷。但是這個需要花費的記憶體是多大呢?  大家可以去算一下

python3 使用openpyxlmysql資料寫入xlsx

程式設計的生活愈發不容易了,工作越來越難找,說多了都是淚還是給大家貢獻些程式碼比較實際。 python3 連結資料庫需要下載名為pymysql的第三方庫 python3 讀寫xlsx需要下載名為openpyxl的第三方庫 在此我只貢獻連結資料庫和寫入xlsx的程式碼 import p

資料結構】點陣BitMap

給40億個不重複的無符號整數,沒拍過序。給定一個無符號整數,如何可以高效的判斷是否存在這些資料中。 直接的想法是,我們將這些的無符號整數儲存到記憶體中,然後用給定的數進行一一比較。 我們分析一下,一個

python讀寫sqlite3資料庫並統計資料寫入excel

    src = 'F:\\log\\mha-041log\\rnd-log-dl.huawei.com\\test' #    dst = sys.argv[2]     dst = 'F:\\log\\mha-041log\\rnd-log-dl.huawei.co

開啟點陣檔案的方法

在View類的事件裡面選中ID_FILE_OPEN,編寫COMMAND函式,在這個訊息響應函式中編寫如下程式碼: CString  strfilepath; //獲取檔案的路徑   m_bOpen=true; //判斷是不是開啟檔案 void CLoadImageView::

JSON型別資料轉換為物件,並排除指定的屬性.JAVA購物車資料寫入到cookie中

public void addCart(HttpServletRequest request, HttpServletResponse response, Long skuId, Integer quantity) { //獲取所有co

spark dataframe資料寫入Hive分割槽表

從spark1.2 到spark1.3,spark SQL中的SchemaRDD變為了DataFrame,DataFrame相對於SchemaRDD有了較大改變,同時提供了更多好用且方便的API。 DataFrame將資料寫入hive中時,預設的是hive預設資料庫,in