1. 程式人生 > >C++ fstream讀取bmp影象

C++ fstream讀取bmp影象

以前都是使C語言中File* 、fopen、fread等操作檔案,這幾天學習了C++ IO標準庫,就應用來讀取bmp影象。

#include "stdafx.h"
#include <fstream>
# include <windows.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
	BITMAPFILEHEADER fh;
	BITMAPINFOHEADER ih;
	int rows, cols;
	Mat showImg;

	ifstream src("2.bmp", ifstream::binary); //2.bmp為灰度影象
	if (!src)
	{
		cerr << "開啟失敗";
		return -1;
	}
	src.read((char *)&fh, sizeof(BITMAPFILEHEADER));
	if (fh.bfType != 'MB')
	{
		cerr << "這不是BMP影象";
		return -1;
	}
	src.read((char *)&ih, sizeof(BITMAPINFOHEADER));
	rows = ih.biHeight;
	cols = ih.biWidth;
	//bmp影象資料儲存是4位元組對齊的
	int colsDQ = (cols + 3) / 4 * 4;
	//移動到影象資料處
	src.seekg(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD) * 256, ios::beg);//引數:相對位置,起點
	showImg = Mat::zeros(rows, cols, CV_8U);
	//讀取影象資料
	uchar *pData = new uchar[rows*colsDQ];
	src.read((char *)pData, rows*colsDQ);
	//bmp影象資料轉換到Mat影象資料(Mat影象資料非對齊)
	for (int i = rows - 1; i >= 0; --i) //bmp影象儲存為行倒序
		for (int j = 0; j < cols; ++j)
		{
			showImg.ptr<uchar>(rows - 1 - i)[j] = *(pData + i*colsDQ + j);
		}
	delete[]pData;
	imshow("hi", showImg);

	waitKey();
	return 0;
}

參考:

相關推薦

C++ fstream讀取bmp影象

以前都是使C語言中File* 、fopen、fread等操作檔案,這幾天學習了C++ IO標準庫,就應用來讀取bmp影象。 #include "stdafx.h" #include <fstream> # include <windows.h> #

C語言讀取BMP數字影象

// 資料型別說明: // WORD:16位無符號短整形,佔2個位元組 // DWORD:32位無符號短整形,佔4個位元組 // LONG:有符號32位整形,佔4個位元組 // RGBQUAD:用於定義調色盤陣列元素的型別 // LPBITMAPINFOHEADER:點陣圖資

C語言實現BMP影象旋轉

 實現影象旋轉,首先要對影象的儲存,影象的讀寫比較清楚,在此基礎上進行線性變換。以下程式碼為逆時針旋轉90度,後續會給出旋轉任意角度的程式碼: 核心還是掌握旋轉時的前後變換。變換的過程可以歸結為:首先將影象座標變換為數學座標,然後在數學座標上進行變換,然後在進行逆變換,得到在影象座

C語言實現BMP影象旋轉(任意角度)

實現對對任意角度的旋轉,具體數學推導網上找。如果各位讀者需要使用,只需要將開啟檔案的位置改為你的位置,輸入不同的角度即可: #include <Windows.h> #include <stdio.h> #include <stdlib.h> #incl

C語言實現BMP影象縮放

對BMP影象用C語言實現影象的縮放。縮放的倍數通過輸入設定 #include <Windows.h> #include <stdlib.h> #include <stdio.h> #include <math.h> int main(int

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

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

讀取BMP影象每一畫素點RGB資料

      對於24位bmp圖片,每一個畫素點存放著此點的RGB值。首先定義一個結構體,包含紅(red)、綠(green)、藍(blue)這三個欄位,如下: //畫素顏色值 typedef struct tagPOINT{ BYTE b; BYTE g; BYTE

運用opencv 讀取BMP影象畫素資訊 程式碼及實現

1. 環境:Win7(64位),opencv2.3,vs2010 2.程式碼: /////////////////////////////////////////////////////////////////////////////////////////////////

【數字影象處理】C++讀取、旋轉和儲存bmp影象檔案程式設計實現

通過我這些天用C++讀寫bmp影象的經歷,摸索再摸索,終於對bmp檔案的結構、操作有了一定的瞭解,下面就大概介紹bmp圖片純C++的讀取、旋轉和儲存的實現過程。 有幾點需要注意的是: 在讀取bmp圖片的時候,一定要注意記憶體對齊的問題,譬如檔案頭,否則無法讀取出正確結果。

24位bmp影象的資料讀取&儲存

24位bmp檔案的讀取&儲存 我採用的方法是將影象檔案讀取,儲存到一維陣列中,以便後期的操作。    void checkFileExist(FILE * fpbmp) {     //開啟圖片檔案 按照二進位制讀取  

C++——bmp影象裁剪

在之前的部落格中,我們已經實現了bmp影象的讀取與儲存,本文在之前的基礎上對對人影象的資料區進行處理,達到擷取影象部分割槽域的目的,以便以後的影象處理操作,程式碼如下:#include <string.h> #include <malloc.h

C++——bmp影象灰度化+二值化

本文實現bmp影象的灰度化及二值化操作:1、灰度化       對於彩色轉灰度,有一個很著名的心理學公式:                          Gray = R*0.299 + G*0.587 + B*0.114而實際應用時,希望避免低速的浮點運算,所以需要整數

BMP影象讀取和生成

1. BMP.h #ifndef _BMP_H_ #define _BMP_H_ #ifdef __cplusplus extern "C" { #endif typedef enum _BIT_DATA_TYPE_{ B

讀取24位 BMP 影象並生成 JPG 縮圖(一)

            //對24位BMP進行解析     if(nbitcount==24){         int npad=(nsizeimage/nheight)-nwidth*3;         int ndata[]=new int[nheight*nwidth];         byte

android上用C語言讀取fb0實現截圖,並儲存為rgb565的bmp

好久沒有看,這兩天在折騰一下,更新一下:修正了framebuffer bgra_8888格式截圖變紅的問題 =================================       android上用C語言讀取fb0實現截圖,儲存為bmp圖片, 支援16位

BMP影象的灰度化---C++實現

灰度圖的結構主要包括檔案頭,BMP資訊頭,調色盤,BMP資料內容四部分。灰度圖的調色盤共有256項RGBQUAD結構,存放0到255的灰度值,每一項rgbRed、rgbGreen、rgbBlue分量值相等。 24位真彩BMP影象的灰度化       把24位真彩BMP影象

c++讀取bmp圖片詳解

先介紹幾個會用到的函式。 1、FILE * fopen(const char * path,const char * mode); path是字串型別的bmp圖片路徑;mode讀取方式,等下回用到"rb",讀寫開啟一個二進位制檔案,允許讀寫資料,檔案必須存在。 2、int

C++——bmp影象的平滑、銳化(拉普拉斯+sobel+prewitt+Roberts Cross operator)

本文實現了RGB三通道影象及灰度影象的平滑、銳化處理。在開始之前,我們先對平滑及銳化的概念進行一個簡單的瞭解:1、平滑       影象平滑是指受感測器和大氣等因素的影響,遙感影象上會出現某些亮度變化過大的區域,或出現一些亮點(也稱噪聲)。這種為了抑制噪聲,使影象亮度趨於平緩

C++fstream,ifstream和outstream讀取檔案最後一行注意

char cntext[1024] = {0};  fstream cnText("E:\\Work\\Diagnose\\Chrysler\\BAIC\\CN_TEXT.txt");  //cnText.open(("E:\\Work\\Diagnose\\Chrysle

實現影象格式的轉換程式碼 C語言實現 RGB565轉BMP影象

這是我從網上看到的寶貴資料,可以直接實現RGB565 轉BMP影象的實現。我是用的開發板mini2440的開發板,和配套的攝像頭CAM130,實際上CAM130用的是OV9650的一款攝像頭;拍出的照片為RGB565的格式,因為這種格式直接可以送到 TFT螢幕上直接顯示;