2010-05-01 117 views
3

我試圖創建一個程序,該程序讀取圖像(以位圖開始,因爲它們是最簡單的),通過圖像搜索特定參數(即一個像素(255,0,0),然後是(0,0,255)之一),並以某種方式更改像素(僅在程序中,不保存到原始文件中),然後顯示它。C++讀取和編輯位圖圖像的像素

我使用Windows,簡單的GDI爲首選項,我想避免自定義庫僅僅是因爲我想真正理解我爲這個測試程序做了什麼。

任何人都可以幫忙嗎?以任何方式?一個網站?建議嗎?示例代碼?

感謝

+0

讀取其中的圖像?從磁盤還是以某種形式存在於內存中? – 2010-05-01 18:12:05

+0

從磁盤讀入內存,然後對內存版本進行檢查 – BettyD 2010-05-01 18:13:52

回答

4

但是,如果「位圖」你的真正用意位圖(即原始圖像文件什麼也沒有,但未被壓縮的像素數據),這是相當容易:

char *filename = "filename"; 
FILE *input = fopen(filename, "rb+"); 
if (!input) 
{ 
    printf("Could not open input file '%s'\n", filename); 
    system("PAUSE"); 
    return 1; 
} 

fseek(input, 0, SEEK_END); 
size_t size = ftell(input); 
rewind(input); 

char *buffer = (char *) malloc(size); 
if (!buffer) 
{ 
    printf("Out of memory, could not allocate %u bytes\n", size); 
    system("PAUSE"); 
    return 1; 
} 

if (fread(buffer, 1, size, input) != size) 
{ 
    printf("Could not read from input file '%s'\n", filename); 
    free(buffer); 
    fclose(input); 
    system("PAUSE"); 
    return 1; 
} 
fclose(input); 

// we loaded the file from disk into memory now 

for (size_t i = 0; (i + 3) < size; i += 4) 
{ 
    if (buffer[i + 0] == 0xFF && buffer[i + 1] == 0x00 && buffer[i + 2] == 0x00 && buffer[i + 3] == 0x00) 
    { 
     printf("Pixel %i is red\n", (i/4)); 
    } 
} 

free(buffer); 

對不起,這是C風格,但是你可以很容易地改變分配到C++風格。就我個人而言,我喜歡閱讀文件的C方式。 通常,您會希望if語句檢查像素是否是紅色是宏/函數。這將使if語句像「if(compare_4bytes(buffer,0xFF000000))」。

此外,這裏假定加載的文件完全由原始像素數據組成。如果情況並非如此,即。您閱讀.bmp/.png/.jpg或其他內容,您必須首先加載然後將內存中的文件轉換爲原始像素數據。這將在評論 「我們現在將文件從磁盤加載到內存中」完成。

BMP肯定是可行的(它幾乎是原始像素數據),但大多數其他類型需要大量的工作/研究。他們經常使用複雜的壓縮算法。我建議你爲此將使用一個庫,只是爲了將其轉換爲原始像素數據。

科羅納是一個很好的(小)一個(http://corona.sourceforge.net/),還是魔鬼(http://openil.sourceforge.net/)或幾千人:)