C 讀取BMP影象

時間 2021-10-30 05:39:20

1樓:

你好,我把問題補充一下,希望對你有幫助。如果還是不行,你再問我。

在你如下的程式段中:

//讀取標頭檔案

fseek( rfile , sizeof(short) ,seek_set );

fread( pointfh ,sizeof(bitmapfileheader) , 1 , rfile );

//讀取資訊標頭檔案

fseek( rfile , sizeof(bitmapfileheader)+sizeof(short) ,seek_set );

fread( pointih ,sizeof(bitmapinfoheader),1, rfile );

//讀點陣圖資訊

pointimage=(char*)calloc(ih.bisizeimage*3, sizeof(char));

fseek(rfile,fh.bfoffbits,seek_set);//頭指標移動到點陣圖區

fread(pointimage,sizeof(char),ih.bisizeimage*3,rfile);

第一句中,我覺得不要加sizeof(short),而是將其改為0。因為檔案的前sizeof(bitmapfileheader)個位元組就是 檔案資訊頭,緊接其後的sizeof(bitmapinfoheader)個位元組是點陣圖資訊頭,所以在你的第三條語句中,也應去掉sizeof(short)。另外,bisizeimage就是點陣圖畫素資訊實際佔用的儲存空間長度,不需要乘以3,所以在上面第5和第7句中應將「*3」去掉。

這時你在執行一下試試。

還有,24位點陣圖每個畫素用3個位元組表示。你的256畫素*256畫素的影象的實際佔用的位元組數應是256*256*3 = 196608,這正是bisizeimage的值!

bmp檔案分為四個部分:

檔案資訊頭、點陣圖資訊頭、調色盤、點陣圖資訊資料。

你在讀資訊標頭檔案後,應該讀調色盤資料。對於真彩色影象,因為沒有調色盤,所以不用讀;但對於其他的影象就需要讀了。這是你的**存在的問題之一。

解決辦法是根據bibitcount的值判斷調色盤的大小:若bibitcount為1,調色盤大小為2*sizeof(rgbquad)位元組;若為4,調色盤16*sizeof(rgbquad);若為8,調色盤256*sizeof(rgbquad);若為24,調色盤為0。

另外,點陣圖資訊資料每行儲存的位元組數一定是4位元組的整數倍,不足的時候補0。比如你的影象每行只有一個畫素,一個畫素用三個位元組儲存,那麼在實際儲存該影象時需要在每行多補充一個位元組,以使其達到4位元組的整數倍。bisizeimage的值就是影象資訊資料實際儲存的位元組數,讀的時候直接讀這麼多位元組的資料就行了,不需要乘以3。

你的**在讀信圖資訊時並沒考慮這一點,這是存在的問題之二。影象每行儲存的實際位元組數:nbytesperline = bisizeimage / biheight,這個值在後續的處理中可能會用到。

你說讀取的解析度是3780,是指每米有3780個畫素,單位是畫素/米。而那個96的單位可能不是畫素/米。

希望對你有幫助。

2樓:

用c++的readfile函式就可以讀bmp檔案的,只是的先知道bmp檔案的結構,這樣才知道讀出來的是檔案的描述資訊還是影象的資訊。。。bmp檔案的結構包括四部分,前三部分存了影象的各種資訊,最後一部分才是影象的色彩資訊。。它們的具體的資料結構,請來這裡看:

3樓:小炫馬紮

可以看下如下的操作:

1、**檔案是有固定格式的,像bmp**是檔案頭+點陣圖的顏色資料。

檔案頭一般在讀取的時候是使用下面的**:

bitmapfileheader fileheader=;

if(fileheader.bftype!=0x4d42) // 判斷是否為bmp**

bitmapinfoheader head;

long bmpwidth = head.biwidth; //獲取**的寬

long bmpheight = head.biheight; //獲取**的寬

word bibitcount = head.bibitcount;

if(bibitcount != 24) // 是否為24位點陣圖

2、檔案讀到這裡了就要讀到點陣圖的顏色資料了,那麼在讀取前,需要知道資料的大小,這樣才能把分配具體大學的緩衝區,之後把資料完整的讀取到緩衝區內。

那麼計算點陣圖資料的大小一般用下面的**去做。

int totalsize = (bmpwidth *bibitcount/8+3)/4*4*bmpheight;

byte *pbmpbuf = new byte[totalsize];

3、在這些工作做完之後,就使用fread命令直接讀取檔案內容即可,直到讀到檔案結束。

整個具體的**實現如下:

file *fp=null;

if(fp==0)

bitmapfileheader fileheader=;

if(fileheader.bftype!=0x4d42)

bitmapinfoheader head;

long bmpwidth = head.biwidth;

long bmpheight = head.biheight;

word bibitcount = head.bibitcount;

if(bibitcount != 24)

int totalsize = (bmpwidth *bibitcount/8+3)/4*4*bmpheight;

byte *pbmpbuf = new byte[totalsize];

size_t size = 0;

while(true)

fclose(fp);

int i,j;

cclientdc dc(this);

int pitch=bmpwidth%4;

for(i=0;i

delete pbmpbuf; pbmpbuf = null;

return ;

4樓:石頭翔子

資料在黑屏下顯示資料量會很大,故存為dat檔案;

#include

#include

/*輸入的指令必須如下格式: command xx.bmp width height

command 編譯之後的程式名稱

xx.bmp 需要獲取畫素值的bmp檔名,需輸入副檔名width,height bmp檔案的大小*/int main(int argc,char* ar**)fclose(pout);

return 0;}

sai為什麼讀取影象失敗,SAI為什麼讀取影象失敗

一般來說,出現讀取影象失敗的話,一般都是檔案損壞,那麼是沒辦法破的了,只能重畫了。可能是因為用低版本的sai建立的sai檔案 你可能換過sai的版本吧 sai某些版本 比如1.1.15 建立的檔案,在其他新版本的sai上不能開啟。儘量不儲存sai格式,因為sai只要在畫的過程中軟體一掛,這次繪製的東...

c語言讀取檔案的函式程式解釋,C語言讀取檔案的函式 程式解釋

原來是空連結串列,p1,p2原來是兩個空節點,迴圈裡面p1先申請一塊記憶體塊,得到一個結點,並且這個結點從檔案輸入了資料 然後p2 next p1 就是得到連結串列 head p2 p1 p2 p1,那麼連結串列就是 head 空節點 p2,下一次迴圈,p1又申請了一塊記憶體並得到一個節點,p2 n...

c如何讀取SQL中的資料,C 中怎麼讀取SQL資料庫表中的資料後顯示在一個TEXTBOX中

string strconn data source 資料庫伺服器名稱或ip initial catalog 資料庫名稱 persist security info true user id sa password password sqlconnection conn new sqlconnect...