位深度24轉8

2021-10-09 19:04:00 字數 4319 閱讀 3849

最近做東西,需要8位的作為輸入,採集的資料為24位,偶然看到一篇部落格寫了完整**,非常可,做了些修改,能進行批量處理。特感謝該博主的無私奉獻。

修改後:

#include

"pch.h"

#include

//code by xets007

//#include

#include

#include

#include

#include

using

namespace std;

using

namespace cv;

bool bmp24to8

(const

char

*szsourcefile,

const

char

*sztargetfile)

;//void get_file_names(string dir_name, vector& names);

intmain

(int argc,

char

* ar**)

//呼叫這個函式直接把24位真彩色灰度化

bool stat =

bmp24to8

(path.

data()

,outpath.

data()

);imgnum++

; std::cout << imgnum;

}while

(true);

std::cout << imgnum;

return0;

}bool bmp24to8

(const

char

*szsourcefile,

const

char

*sztargetfile)

dword dwtemp =0;

readfile

(hsourcefile, psource, dwsourcesize,

&dwtemp,

null);

bitmapfileheader *psourcefileheader =

(bitmapfileheader*

)psource;

bitmapinfoheader *psourceinfoheader =

(bitmapinfoheader*

)(psource +

sizeof

(bitmapfileheader));

//不是bmp檔案或者不是24位真彩色

if(psourcefileheader-

>bftype !=

0x4d42

|| psourceinfoheader-

>bibitcount !=24)

closehandle

(hsourcefile)

; long nwidth = psourceinfoheader-

>biwidth;

long nheight = psourceinfoheader-

>biheight;

long nsourcewidth = nwidth *3;

if(nsourcewidth %

4) nsourcewidth =

(nsourcewidth /4+

1)*4

; long ntargetwidth = nwidth;

if(ntargetwidth %

4) ntargetwidth =

(ntargetwidth /4+

1)*4

; dwtargetsize =

sizeof

(bitmapfileheader)

+sizeof

(bitmapinfoheader)

+sizeof

(rgbquad)

*256

+ nheight * ntargetwidth;

ptarget =

(pbyte)

virtualalloc

(null

, dwtargetsize, mem_commit, page_readwrite)

;memset

(ptarget,

0, dwtargetsize);if

(ptarget ==

null

) bitmapfileheader *ptargetfileheader =

(bitmapfileheader *

)ptarget;

bitmapinfoheader *ptargetinfoheader =

(bitmapinfoheader *

)(ptarget +

sizeof

(bitmapfileheader));

ptargetfileheader-

>bftype = psourcefileheader-

>bftype;

ptargetfileheader-

>bfsize = dwtargetsize;

ptargetfileheader-

>bfreserved1 =0;

ptargetfileheader-

>bfreserved2 =0;

ptargetfileheader-

>bfoffbits =

sizeof

(bitmapfileheader)

+sizeof

(bitmapinfoheader)

+sizeof

(rgbquad)

*256

; ptargetinfoheader-

>bibitcount =8;

ptargetinfoheader-

>biclrimportant =0;

ptargetinfoheader-

>biclrused =

256;

ptargetinfoheader-

>bicompression = bi_rgb;

ptargetinfoheader-

>biheight = psourceinfoheader-

>biheight;

ptargetinfoheader-

>biplanes =1;

ptargetinfoheader-

>bisize =

sizeof

(bitmapinfoheader)

; ptargetinfoheader-

>bisizeimage = nheight * ntargetwidth;

ptargetinfoheader-

>biwidth = psourceinfoheader-

>biwidth;

ptargetinfoheader-

>bixpelspermeter = psourceinfoheader-

>bixpelspermeter;

ptargetinfoheader-

>biypelspermeter = psourceinfoheader-

>biypelspermeter;

rgbquad *prgb;

for(

int i =

0; i <

256; i++

)//初始化8位灰度圖的調色盤資訊

for(

int m =

0; m < nheight; m++

)//轉化真彩色圖為灰度圖

} htargetfile =

createfile

(sztargetfile, generic_write, file_share_write,

null

, create_always, file_attribute_normal,

null);

bool stat =

writefile

(htargetfile, ptarget, dwtargetsize,

&dwtemp,

null);

closehandle

(htargetfile)

;virtualfree

(psource,

null

, mem_release)

;virtualfree

(ptarget,

null

, mem_release)

;return stat;

}

學習到的知識:

1.char,string 等的轉換

8位深 16位深 24位深

乙個畫素用多少位表示,例如,乙個畫素點,用1位資料表示的話,它有兩種顏色可以選擇 2的1次方,黑白兩種 如乙個畫素點,用8位的資料表示的話,這個點可以有2的8次方 256 種顏色的選擇,同理,16 24等。8位rgb影象 16位rgb影象 這裡的8位是針對rgb影象而言,rgb影象由三個顏色通道組成...

遙感影像16位轉8位

現在常用衛星影像基本上都是16位影像,如gf,zy3,landsat8,wv等,有時我們需要將16位影像降到8位影像,這樣不僅減小了資料量,也便於後期處理。通常的軟體在處理降位時會存在一些問題,如 出現空值等。因此,我自己根據常用的降位方法,如最簡單的線性拉伸,分段拉伸以及對數變換和指數變換,結合常...

常用資料轉換,8位轉16位 32位函式,複製就能用

下面包含8 轉 32,32轉8,8轉16,16轉8,16轉32,32轉16等微控制器內常用的資料型別轉換,直接複製就可使用,感覺好用可以加關注,以後會經常更新一些常規好用的小 8位轉32位 len 資料長度 data 資料 說明 剩餘位補0 unsigned int data u32 10 void...