最近做東西,需要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...