2011-02-04 68 views
0

交換像素我想修改一個位圖:如何更改,修改,剪切和BITMAP

  • 變化(互換)的像素位置(魚眼後整流)

  • 分位圖在子位圖(例如,使4位圖總分1)(對於不同的GL_QUADS以後組織化)

爲此,我需要的代碼如何修改的位圖的像素。

的follwing代碼示例工程和從文件創建紋理:

HBITMAP hbpInput = (HBITMAP)::LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); 

BITMAP bmpOutput; 
::GetObject (hbpInput, sizeof (bmpOutput), &bmpOutput); 

(...) 

glTexImage2D(GL_TEXTURE_2D, 0, 3, bmpOutput.bmWidth, bmpOutput.bmHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bmpOutput.bmBits); 

哪些代碼需要得到位陣列?

我想已經的GetDIBits(),但是,這並不工作獻給IMAGE(結構),你一定會知道:)

任何具體的想法如何能夠改變像素的立場?

非常感謝!

回答

0

在下面的調用最後一個參數是對於所述像素的字節數組:

glTexImage2D(GL_TEXTURE_2D, 0, 3, bmpOutput.bmWidth, bmpOutput.bmHeight, 
      0, GL_RGB, GL_UNSIGNED_BYTE, bmpOutput.bmBits); 

這意味着bmpOutput.bmBits指向的第一個字節中含有下列數量的字節的數組:

3 * bmpOutput.bmWidth * bmpOutput.bmHeight 

這意味着每個像素3個字節(紅,綠,藍各一個)。

說了這麼多,基於你的問題,這聽起來像你真正想要的是能夠將紋理的不同部分映射到不同的四邊形。爲此,您可以使用texture atlas。只使用一個紋理對象,但調整每個四邊形的紋理座標以映射到紋理圖像的不同部分。

0

那麼,因爲位圖是如此簡單的文件,你可以只讀頭和構造像素的數組/矢量並編輯。

這是我很久以前寫的一個func,它充滿了一些不好的編碼習慣。

m_imagefile是一個基本的結構,包含重要的圖像信息,如寬度,高度,bpp,格式和原始字節數組。

m_imagefile *loadBMP(char *Filename) { 
    FILE  *BMPFile=NULL; 
    errno_t  error; 
    m_imagefile *IMG=NULL; 

    error=fopen_s(&BMPFile, Filename, "rb"); 
    if(error!=0) { 
     return NULL; 
    } 

    IMG=new m_imagefile; 

    GLshort magic=0; 

    fseek(BMPFile, 0x00, SEEK_SET); 
    fread(&magic, sizeof(GLshort), 1, BMPFile); 
    fseek(BMPFile, 0x12, SEEK_SET); 
    fread(&IMG->width, sizeof(GLint), 1, BMPFile); 
    fseek(BMPFile, 0x16, SEEK_SET); 
    fread(&IMG->height, sizeof(GLint), 1, BMPFile); 
    fseek(BMPFile, 0x1C, SEEK_SET); 
    fread(&IMG->bpp, sizeof(GLshort), 1, BMPFile); 

    //First 2 bytes should be 0x424d or "BM" in ASCII 
    if(IMG->width == 0 || IMG->height == 0 || !(magic & 0x424D)) { 
     fclose(BMPFile); 
     delete IMG; 
     return NULL; 
    } 

    //Bitmaps are stored as BGR, not RGB 
    if(IMG->bpp==24) { 
     IMG->format = GL_BGR_EXT; 
    } else if(IMG->bpp==32) { 
     IMG->format = GL_BGRA_EXT; 
    } else { 
     fclose(BMPFile); 
     delete IMG; 
     return NULL; 
    } 

    IMG->data=new GLubyte[IMG->height*IMG->width*IMG->bpp/8]; 
    fseek(BMPFile, 54, SEEK_SET); 
    fread(IMG->data, sizeof(GLbyte), IMG->height*IMG->width*IMG->bpp/8, BMPFile); 

    fclose(BMPFile); 

    return IMG; 
} 
+0

@Shezan Baig @Murka 感謝您的提示。爲了使用原生函數,我將格式BITMAP更改爲CImage。用CImage和你的答案很容易爲der rgba值創建一個數組。 – Schnu 2011-02-08 09:19:47