簡體   English   中英

C ++ :. bmp到文件中的字節數組

[英]C++: .bmp to byte array in a file

是的,我已經解決了與此相關的其他問題,但是我發現它們並沒有太大幫助。 他們是一些幫助,但我仍然有些困惑。 所以在這里我需要做什么:

我們有132x65的屏幕。 我有132x65 .bmp。 我想遍歷.bmp並將其分成1x8小列以獲取該32位列的二進制文件。 然后進行132次,向下進行9次。 任何不是白色的東西都應該算作一點。 例:

如果圖片的左上像素是非白色的顏色,而下方的7個像素是白色,則該顏色將是數組的第一個元素,即該數字的十六進制,因此數組將如下所示:array [ ] = {0x01},然后它將繼續填充這132列,然后針對9個“節”的行再次進行填充。 而且文件結果只能是該數組在單獨的文件中。

我了解其標題格式,我已經閱讀了有關.bmp文件格式的Wiki文章,我的主要問題是,當我實際上希望將其放入內部並與每個像素進行交互時,我真的不知道如何與.bmp進行交互。從圖像。 我真的不需要整個東西,但也許只是一個示例,它是從.bmp中抓取每個像素並將其顏色輸出到文件或其他內容中的示例。 我的C ++有點生銹(最近開始使用Java和Javscript)。

如果您想讀取一種已知格式的BMP,而不關心它是如何完成的(即,僅限內部使用),則可以使用BMP,忽略標頭並將其用作像素數組。 它從左下角開始逐行存儲。 關於如何打包有一些細節障礙,但是根據我的經驗,如果您拍攝32bpp的圖像,則可以完全忽略它。

作為一個非常簡單的示例:

unsigned int *buffer;
void readfile() {
    FILE *f = fopen("file.bmp", "rb");
    buffer = new unsigned int[132*65];
    fseek(f, 54);
    fread(buffer, 132*65*4, 1, f);
    fclose(f);
}

unsigned int getpixel(int x, int y) {
    //assuming your x/y starts from top left, like I usually do
    return buffer[(64 - y) * 132 + x];
}

我遇到了同樣的問題,但是通過讀取BMP文件格式說明,我編寫了一個函數,該函數讀取.BMP文件並將其存儲到數組中。 也許此功能可以幫助您:

unsigned int PIC::BinToNum(char *b,int bytes)
{
    unsigned int tmpx = 0;
    unsigned int pw = 1;
    for(int i=0;i<bytes;i++)
    {
        tmpx += ((unsigned char)b[i]* pw);
        pw = pw * 256;
    }
    return tmpx;
}

int PIC::Open(const char *path)
{
    int pad = 0;
    unsigned int sof = 0;
    unsigned int tx = 0;
    char tmp[4] = {0,0,0,0};
    fstream file;
    file.open(path,ios::in);
    if(file.fail())
    {
        width=height=ColorBits=size=0;
        return -1;
    }
    else
    {
        file.seekg(0,ios::beg);
        file.read(tmp,2);
        if(!(tmp[0] == 66 && tmp[1] == 77))
        {
            width=height=ColorBits=size=0;
            return 0;
        }
        else
        {
            file.seekg(2,ios::beg); // 0x2 size
            file.read(tmp,4);
            size = BinToNum(tmp,4);
            file.seekg(18,ios::beg); // 0x12 width
            file.read(tmp,4);
            width = BinToNum(tmp,4);
            file.seekg(22,ios::beg); // 0x16 height
            file.read(tmp,4);
            height = BinToNum(tmp,4);
            file.seekg(28,ios::beg); // 0x1C Bits per Pixel
            file.read(tmp,2);
            ColorBits = BinToNum(tmp,2);
            file.seekg(10,ios::beg); // 0x0A start offset
            file.read(tmp,4);
            sof=BinToNum(tmp,4);
            file.seekg(34,ios::beg); // 0x22 Padding
            file.read(tmp,4);
            pad = BinToNum(tmp,4);
            pad = (int)(pad / height); // Compute Spacing in each row
            pad = pad - (width*ColorBits/8);

            // Initialize Matrix//
            matrix = new(unsigned int[height*width]);

            for(int h=height-1;h>=0;h--)
            {
                for(int w=0;w<=width-1;w++)
                {
                    file.seekg(sof,ios::beg);
                    file.read(tmp,(int)(ColorBits/8));
                    tx = BinToNum(tmp,(int)(ColorBits/8));
                    matrix[(h*width)+w] = tx;
                    sof+=(int)(ColorBits/8);
                }
                sof +=pad;
            }
        }
    }
    file.close();
    return 1;
}


Note:This functions is member of a class that i named it "PIC"...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM