2009-12-28 50 views
5

我得到了一個閱讀bmp圖像的問題。我如何獲得像素值(R,G,B值)在一個BMP圖像? 任何人都可以幫助我使用C編程語言嗎?獲取BMP文件的像素值

回答

7

簡單的方法是爲您選擇的平臺找到一個好的圖像處理庫並使用它。

困難的方法是打開文件並實際解釋其中的二進制數據。要做到這一點,你需要BMP File Specification。我建議先嚐試簡單的方法。

6

您需要研究BMP文件格式。讀取未壓縮的24位BMP文件比較容易。它們只在開頭包含一個標題,並且包含每個像素的RGB值。

要開始此操作,請檢查位於http://en.wikipedia.org/wiki/BMP_file_format的2x2位圖圖像的示例。按照以下步驟。

  1. 創建維基百科上顯示的2x2 BMP圖像。
  2. 使用C程序以二進制模式打開文件。
  3. 尋找字節位置54.
  4. 讀取3個字節。

這些字節將分別爲0,0和255。 (不知道該命令是否爲RGB,我已經完成了這一步,我認爲命令不是RGB,只需驗證一下。)

就這麼簡單!研究BMP的標題以更多地瞭解格式。

10

注意:如果您的BMP有alpha通道,您可能需要爲alpha值獲取額外的字節。在這種情況下,圖像將是image[pixelcount][4],並且您將添加另一條getc(streamIn)線來保存第四個索引。我的BMP結果不需要那樣。

// super-simplified BMP read algorithm to pull out RGB data 
// read image for coloring scheme 
int image[1024][3]; // first number here is 1024 pixels in my image, 3 is for RGB values 
FILE *streamIn; 
streamIn = fopen("./mybitmap.bmp", "r"); 
if (streamIn == (FILE *)0){ 
    printf("File opening error ocurred. Exiting program.\n"); 
    exit(0); 
} 

int byte; 
int count = 0; 
for(i=0;i<54;i++) byte = getc(streamIn); // strip out BMP header 

for(i=0;i<1024;i++){ // foreach pixel 
    image[i][2] = getc(streamIn); // use BMP 24bit with no alpha channel 
    image[i][1] = getc(streamIn); // BMP uses BGR but we want RGB, grab byte-by-byte 
    image[i][0] = getc(streamIn); // reverse-order array indexing fixes RGB issue... 
    printf("pixel %d : [%d,%d,%d]\n",i+1,image[i][0],image[i][1],image[i][2]); 
} 

fclose(streamIn); 

〜Locutus

+0

是不是有你需要闖過你打的圖像數據前的頭塊? – 2011-08-30 04:56:39

+1

@Anon如果我的文件是jpeg,該怎麼辦? – Kraken 2013-04-15 20:30:23