1. 程式人生 > >儲存影象資料為BMP格式的圖片

儲存影象資料為BMP格式的圖片

BMP檔案是Windows作業系統所推薦和支援的影象檔案格式,是一種將記憶體或顯示器的影象資料不經過壓縮而直接按位存檔的檔案格式,所以稱為點陣圖(bitmap)檔案。

BMP檔案結構

BMP影象檔案包括四個部分:

1、點陣圖檔案頭(Bitmap File Header)

2、點陣圖資訊頭(Bitmap Info Header)

3、顏色表(Color Map)

4、影象資料(即影象資料,Data Bits)

一、點陣圖檔案頭,是一個結構體型別,長度固定為14個位元組。定義如下:

typedef unsigned char LBYTE;	
typedef unsigned short LWORD;	
typedef unsigned int LDWORD;		
typedef long LLONG;			

typedef struct
{
	LWORD bfType;            //點陣圖檔案型別,必須是0X4D42
	LDWORD bfSize;            // 點陣圖檔案大小
	LWORD bfReserved1;        //windows保留字
	LWORD bfReserved2;        //windows保留字,暫時不用
	LDWORD bfOffBits;        //從檔案頭到實際的點陣圖資料的偏移位元組數
}LBITMAPFILEHEADER;

二、點陣圖資訊頭

typedef struct
{
	LDWORD biSize;            //點陣圖資訊頭的長度,40位元組
	LLONG biWidth;            //點陣圖的寬度
	LLONG biHeight;           //點陣圖的高度
	LWORD biPlanes;           //目標裝置級別,必須為1
	LWORD biBitCount;         // 每個畫素所佔位數(bit),二值影象為1,灰度影象為8,真彩色影象為24
	LDWORD biCompression;     //  點陣圖壓縮型別
	LDWORD biSizeImage;       // 實際的點陣圖資料佔用的位元組數
	LLONG biXPelsPerMeter;    //指定目標裝置的水平解析度
	LLONG biYPelsPerMeter;    //指定目標裝置的垂直解析度
	LDWORD biClrUsed;         // 點陣圖實際用到的顏色數
	LDWORD biClrImportant;    // 點陣圖顯示過程中重要的顏色數
}LBITMAPINFOHEADER;

三、顏色表

顏色表也是一個結構體型別,實際上是一個顏色表結構的陣列,陣列的長度由biClrUsed指定。其中有些點陣圖需要顏色表,如灰度圖;有些點陣圖不需要顏色表,如真彩色圖。

typedef struct
{
	LBYTE rgbBlue;        //藍色分量
	LBYTE rgbGreen;       //綠色分量
	LBYTE rgbRed;         //紅色分量
	LBYTE rgbReserved;    //保留位元組,暫時不用
}LRGBQUAD;

四、點陣圖資料

點陣圖資料也就是影象資料,緊跟在點陣圖檔案頭,點陣圖資訊頭和顏色表之後,記錄了影象的每一個畫素值。

需要注意的是,windows規定一個掃描行所佔的位元組數必須是4的倍數,不足4的倍數則要對其進行擴充。則每個掃描行所佔的真實位元組數的計算結果為:int lineByte = (imWidth * biBitCount / 8 + 3)/ 4 * 4;

現在是儲存影象資料的時候,這裡我儲存的是灰度影象的資料,所以直接設定biBitCount的值為8。大家可以根據自己的需求進行修改。saveBMP.cpp的程式碼如下:

#include "StdAfx.h"
#include"bmp.h"
#include<iostream>

using namespace std;

bool SaveBmp1(char * fileName,unsigned char *imgBuffer, int imWidth, int imHeight)
{
	if (!imgBuffer)
	{
		return 0;
	}
	int biBitCount = 8;
	int colorTablesize = 1024;	//灰度影象顏色表
	int lineByte = (imWidth * biBitCount / 8 + 3)/ 4 * 4;
	FILE *fp = fopen(fileName, "wb");
	if (!fp)
	{
		return 0 ;
	}
	LBITMAPFILEHEADER filehead;
	filehead.bfType = 0x4D42;
	filehead.bfSize = sizeof(LBITMAPFILEHEADER) + sizeof(LBITMAPINFOHEADER) + 
		colorTablesize + lineByte * imHeight;
	filehead.bfReserved1 = 0;
	filehead.bfReserved2 = 0;
	filehead.bfOffBits = 54 + colorTablesize;
	//寫點陣圖檔案頭進檔案
	fwrite(&filehead , sizeof(LBITMAPFILEHEADER), 1, fp);

    //申請點陣圖檔案資訊頭結構變數, 填寫檔案資訊頭資訊
	LBITMAPINFOHEADER infoHead;
	infoHead.biBitCount = biBitCount;
	infoHead.biClrImportant = 0;
	infoHead.biClrUsed = 0;
	infoHead.biSize = 40;
	infoHead.biWidth = imWidth;
	infoHead.biHeight = imHeight;
	infoHead.biPlanes = 1;
	infoHead.biCompression = 0;
	infoHead.biSizeImage = lineByte * imHeight;
	infoHead.biXPelsPerMeter = 0;
	infoHead.biYPelsPerMeter = 0;
	fwrite(&infoHead, sizeof(LBITMAPINFOHEADER), 1, fp);
	//fwrite(&filehead, sizeof(LBITMAPFILEHEADER), 1, fp);

	LRGBQUAD *pColorTable = new LRGBQUAD[256];

	for (int i = 0 ; i < 256 ; i++)
	{
		pColorTable[i].rgbBlue = i;
		pColorTable[i].rgbGreen = i;
		pColorTable[i].rgbRed = i;
		//pColorTable[i].rgbReserved = 0;
	}

	fwrite(pColorTable, sizeof(LRGBQUAD), 256, fp);


	//寫點陣圖資料進檔案
	fwrite(imgBuffer, imHeight*lineByte, 1, fp);

	fclose(fp);
	return 1;
}

bmp.h程式碼如下:

#ifndef BMP_H
#define BMP_H

typedef unsigned char LBYTE;	//
typedef unsigned short LWORD;	//
typedef unsigned int LDWORD;
typedef long LLONG;				//

//

#pragma pack(2)
typedef struct
{
	LWORD bfType;
	LDWORD bfSize;
	LWORD bfReserved1;
	LWORD bfReserved2;
	LDWORD bfOffBits;
}LBITMAPFILEHEADER;
// #pragma pack(pop)

typedef struct
{
	LDWORD biSize;
	LLONG biWidth;
	LLONG biHeight;
	LWORD biPlanes;
	LWORD biBitCount;
	LDWORD biCompression;
	LDWORD biSizeImage;
	LLONG biXPelsPerMeter;
	LLONG biYPelsPerMeter;
	LDWORD biClrUsed;
	LDWORD biClrImportant;
}LBITMAPINFOHEADER;

typedef struct
{
	LBYTE rgbBlue;
	LBYTE rgbGreen;
	LBYTE rgbRed;
	LBYTE rgbReserved;
}LRGBQUAD;

typedef struct
{
	unsigned char* buf;
	int width_x;
	int height_y;
	int deepth;
	LRGBQUAD* palette;
}LBmpbase;

//bool saveBmp(char*, unsigned char*, int, int, int, RGBQUAD*);
//Bmpbase readbmp(char*);
bool saveBmp(char*, unsigned char*, int, int, int, LRGBQUAD* );

bool SaveBmp1(char * fileName,unsigned char *imgBuffer, int imWidth, int imHeight);

bool wDataToBitBmp(BYTE*, int imWidth, int imHeight, char *imName); 
// Bmpbasel readbmp(char*);
// Bmpbase imrotate(unsigned char*, int, int, int, RGBQUAD*, double);

#endif

下面是我呼叫SaveBmp1的例項:

SaveBmp1((char *)(LPCTSTR)(strFileName1), pBmpImage, 640, 512);

//strFileName1 為儲存的bmp格式影象的影象名, pBmpImage為 unsigned char * 型別的影象資料, 640,512分別為影象寬和高。

相關推薦

儲存影象資料BMP格式圖片

BMP檔案是Windows作業系統所推薦和支援的影象檔案格式,是一種將記憶體或顯示器的影象資料不經過壓縮而直接按位存檔的檔案格式,所以稱為點陣圖(bitmap)檔案。 BMP檔案結構 BMP影象檔案包括四個部分: 1、點陣圖檔案頭(Bitmap File Header)

開啟DICOM圖片影象內容轉換BMP格式

很久前寫的,也其實就實現一個簡單顯示的問題,對於“窗位”,“窗寬”的取值問題,以前在CSDN上提問過,卻沒有得到很好的解決方案。 對與DICOM圖片的開啟也就實現了,“窗位”,“窗寬”標明的。把顯示部分的程式碼放上來,希望對剛接觸DICOM圖片格式的人有點幫助,若有高手希望

Android儲存32位BMP格式圖片

參考資料:java讀取bmp點陣圖 java讀取bmp影象檔案 Android 獲取24位BMP RGB資料 /** * 獲取BMP 檔案的RGB 資料 * @param srcBitmap 原Bitmap * @return bitmap

python 儲存資料excel格式和txt格式

 excel 儲存方法: book = xlwt.Workbook() #建立表單 sheet = book.add_sheet(u'sheet1',cell_overwrite_ok=True) sheet.write(0,0,'id') sheet.write(0,1,'tex

關於PET重建影象匯出DICOM格式資料出現負值現象

簡述   最近做PET重建影象資料匯出為DICOM3.0格式資料時,匯出後的資料使用Amide和PMOD載入檢視,總是出現一半負值一半正值現象(原始值為正值),百思不得其解。詳細檢視DICOM標準後發現實Tag為(0028,0103)的Pixel Representation引數值本應為0,卻被設定為1了。

tensorflow儲存資料.pb格式和載入pb檔案

最近接觸了tensorflow的object detection API發現裡面讀取的預先訓練模型都是pb格式。谷歌推薦的儲存模型的方式是儲存模型為 PB 檔案,它具有語言獨立性,可獨立執行,封閉的序列化格式,任何語言都可以解析它,它允許其他語言和深度學習框架讀取、繼續訓練和

libjpeg庫編碼圖片jpg(ffmpeg解碼視訊儲存圖片:RGB格式點陣圖壓縮jpg格式圖片)

壓縮流程(結合網上大家的資料以及libjpeg庫的example.c示例:都大同小異): 1、如何分配和初始化一個jpeg壓縮物件:      在libjpeg中jpeg壓縮物件被定義為struct

基於GPU的影象處理輸出bmp格式的圖再轉換tga精度損失問題。

我最近在搞影象處理,我的步驟是 (1)先把要處理的圖片讀進GPU然後用CS處理 (2)把CS的輸出存到磁碟,此時資料是未壓縮的BMP格式 (3)美術同事可能想要其他格式的圖片如tga,所以用ps的批處理把圖片轉為tga或者其他格式。下面就來看看這個過程的精度損失 原始輸出值是0.

stm32驅動ov7670 資料BMP格式再轉JPEG儲存

一.搞了幾天攝像頭終於搞出來了一點成果,本打算用BMP格式儲存讀出的資料但是資料太大達到225k,後來又將BMP資料轉成JPEG格式就小了很多,jpeg是有失真壓縮圖片會變得不那麼清晰。 搞出來的成果: 二.攝像頭小知識:XCLK是輸入攝像頭的時鐘,看別的原理圖接

【OpenCV】將影象資料由YUV格式轉換成JPG格式直接使用,而不儲存成檔案

解決方法 使用OpenCV影象編碼和解碼函式:imencode、imdecode std::vector data_encode; imencode(“.png”, img_encode, dat

Android如何把圖片轉為深度32位格式.bmp圖片

前幾天公司的產品要求做個手機拍的照片轉深度為32位,格式為.bmp格式的圖片,仔細研究了下,通過調系統相機根據照片存的路徑以及FileInputStream獲得照片的bitmap,拿到這個bitmap後把資料放到下面的方法裡,可獲取bmp格式的圖片,深度為32位

js獲取input上傳圖片裝換base64格式圖片

file .get reader wim fileread script gen fun return <input name="upimage" id="upload_file" type="file"> <img src="/img/touxiang

使用jupyter notebook 儲存python程式碼.py格式

Jupyter notebook 源自 Fernando Perez 發起的 IPython 專案。IPython 是一種互動式 shell,與普通的 Python shell 相似,但具有一些很好的功能(例如語法高亮顯示和程式碼補全)。 在jupyter notebook裡輸入: %%

一招立刻轉換BMP格式圖片

日常辦公工作中,我們常常需要把CAD圖紙轉換成其他檔案格式。例如,把CAD圖紙轉換成BMP格式圖片可以更加方便地傳輸檢視。那麼如何把CAD圖紙轉換成BMP格式圖片最為簡單方便呢?小編推薦使用迅捷CAD轉換器,CAD圖紙可以一招立刻轉換BMP格式。具體步驟如下:

批量處理或儲存影象資料程式碼

有的時候要批量操作影象,儲存資料或者影象結果。可以利用函式巢狀進行。這個程式碼我是從老師程式碼裡看到的,我將其運用於去偽輪廓專案裡,儲存K-means聚類結果可行,但是儲存擬合圓影象時出錯(擬合圓不正常),錯誤原因不明,待解決。 注意一點:使用時檢查結果是否正常 巢狀的程式

jmeter--響應資料json格式,中文顯示問題

1.響應資料為json格式,中文顯示如下圖所示 2.在測試計劃新增“BeanShell PostProcessor”,具體步驟:新增-後置處理器-BeanShell PostProcessor 3.在BeanShell PostProcessor新增如下scrip

如何將bmp格式圖片批量轉換成jpg格式

  BMP(全稱Bitmap)是Windows作業系統中的標準影象檔案格式,不採用其他任何壓縮,因此,它的畫質比較清晰,基本可以還原拍攝畫質,淡水BMP檔案所佔用的空間很大。由於BMP檔案格式是Windows環境中交換與圖有關的資料的一種標準,因此在Windows環境中執行的圖形影象軟體都支援BMP影象格

使用Aspose.Words將Word文件轉換Tiff格式圖片檔案

用Aspose元件的優點是操作Word文件不需要安裝Office就可以實現。 首先需要引用Aspose.Words.dll,連結地址:連結:https://pan.baidu.com/s/1rJvjp-kMsEterYf_oud28Q   提取碼:awiw  程式碼如下: public bool Word

【python】儲存某個資料夾下所有圖片名字到一個txt檔案裡

用python實現讀取某一資料夾下的所有圖片名字到一個txt檔案 import os dir1='/data/Datasets/JPEGImages'#圖片檔案存放地址 txt1 = '/data/Datasets/picture.txt'#圖片檔名存放txt檔案地址 f1 = open

YAML的Java實現——JYAML基本原理與示例(1)匯出資料YAML格式檔案

1. Overview JYAML是YAML的Java實現,YAML的全稱是YAML Ain't Markup Language,是否定遞迴定義,和LINUX的Linux Is Not UniX是一個意思。其結構之簡單,常常成為匯出或匯入配置檔案、資料結構等應用場景的常用A