C++讀取、旋轉和保存bmp圖像文件編程實現


     以前也遇到過bmp文件的讀寫。這篇博客很好,寫的其他內容也值得學習。

     參考:http://blog.csdn.net/xiajun07061225/article/details/6633938  學習

      在讀取bmp圖片的時候,一定要注意內存對齊的問題,譬如文件頭,否則無法讀取出正確結果。

關於圖片的像素數據,每一行的像素的字節數必須是4的整數倍。如果不是,則需要補齊。一般來說,bmp圖像文件的數據是從下到上,從左到右的。即從文件中最先讀到的是圖像最下面一行的左邊第一個像素,然后是坐標第二個.....接下來是倒數第二行的第一個像素。

灰度圖:

      灰度圖是只含亮度信息,不含彩色信息的圖像。bmp格式文件中並沒有灰度圖這個概念,但是我們很容易地用bmp文件來表示灰度圖。方法是用256色的調色板,只不過這個調色板有點特殊,每一項的RGB值都是相同的,從(0,0,0),(1,1,1),...,一直到(255,255,255)。這樣,灰度圖就可以用256色圖來表示了。其圖像數據就是調色板索引值,也就是實際的RGB的亮度值。另外因為是256色的調色板,所以圖像數據中的一個字節代表一個像素。如果是彩色的256色圖,圖像處理后可能會產生不屬於這256色的顏色,所以,圖像處理一般采用灰度圖。

調色板,真彩色,DDB,DIB,BMP,RGB,YUV

int loadBitmapFromFile(const char *filePath, U8 **bits)
{
    FILE *fp = fopen(filePath, "rb");
    if (fp == NULL) {
        return 0;
    }
    BITMAPFILEHEADER bfh;
    if (fread(&bfh, sizeof(bfh), 1, fp) != 1) {
        fclose(fp);
        return 0;
    }
    BITMAPINFOHEADER bih;
    if (fread(&bih, sizeof(bih), 1, fp) != 1) {
        fclose(fp);
        return 0;
    }
    if (bih.biBitCount != 8) {
        fclose(fp);
        printf("unsupported bitmap format.\n");
        return 0;
    }
    fseek(fp, bfh.bfOffBits - sizeof(bfh) - sizeof(bih), SEEK_CUR);  //將文件指針移動到離當前位置(調色板大小)字節處
    int imageSize = (bih.biWidth + 3) / 4 * 4 * bih.biHeight;
    U8 *buffer = (U8 *)malloc(imageSize);
    if (fread(buffer, 1, imageSize, fp) != imageSize) {
        fclose(fp);
        return 0;
    }

    fclose(fp);

    *bits = buffer;

    return imageSize;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM