2013-12-17 2 views
-1

Я использую OpenGL и PCL_lib прямо сейчас, и я хочу нарисовать аксессуар на фоне pic.glReadPixels save to BMP - Color Dirstortion

Вот мой output_image на дисплее:

https://www.dropbox.com/s/ocb62klonzxb4yx/IMG_2027%5B1%5D.JPG

источника изображения формата PCD (PCL Lib), обратил на OpenGL

и вот мой код, где сохранить GL_pic:

char filename[100]; 
sprintf(filename, "path", _mframe_Count); 

// Set Parameter 
GLint x, y, width, height; 
int i; 
unsigned long imageSize; 
GLenum lastBuffer 
glGetIntegerv(GL_VIEWPORT, mViewPort); 
x = mViewPort[0]; 
y = mViewPort[1]; 
width = mViewPort[2]; 
height = mViewPort[3];  

BITMAPFILEHEADER bmfh; 
BITMAPINFOHEADER bmih; 
bmfh.bfType = 0x4D42; 
bmfh.bfReserved1 = 0; 
bmfh.bfReserved2 = 0; 
bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmih); 
imageSize = ((width+((4-(width%4))%4))*height*3)+2; 
bmfh.bfSize = imageSize + sizeof(bmfh) + sizeof(bmih); 
GLubyte *pImageData = (GLubyte *)malloc(imageSize); 


// Allocate apicture buffer 
if(pImageData == NULL) 
{ 
    printf("[Error] : grab_GL(), Cannot create Memory_Sapce for pImageData.\n"); 
    return false; 
} 

// Byte alignment (that is, no alignment) 
glPixelStorei(GL_PACK_ALIGNMENT, 4); 
glPixelStorei(GL_PACK_ROW_LENGTH,0); 
glPixelStorei(GL_PACK_SKIP_ROWS,0); 
glPixelStorei(GL_PACK_SKIP_PIXELS,0); 
glPixelStorei(GL_PACK_SWAP_BYTES,1); 
glGetIntegerv(GL_READ_BUFFER, (GLint *)&lastBuffer); 
glReadBuffer(GL_FRONT); 

glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pImageData); 
pImageData[imageSize-1] = 0; 
pImageData[imageSize-2] = 0; 
glReadBuffer(lastBuffer); 


FILE *pWritingFile = fopen(filename, "wb"); 
if (pWritingFile == NULL) 
{ 
    free(pImageData); 
    printf("[Error] : grab_GL(), Cannot open %s for writting.\n", filename); 
    return false; 
} 

// BMP Structures 
bmih.biSize = sizeof(bmih); 
bmih.biWidth = width; 
bmih.biHeight = height; 
bmih.biPlanes = 1; 
bmih.biBitCount = 24; 
bmih.biCompression = 0; 
bmih.biSizeImage = imageSize; 
bmih.biXPelsPerMeter = 2835; 
bmih.biYPelsPerMeter = 2835; 
bmih.biClrUsed = 0; 
bmih.biClrImportant = 0;  

// BMP Compress 
fwrite(&bmfh, 8, 1, pWritingFile); 
fwrite(&bmfh.bfReserved2, sizeof(bmfh.bfReserved2), 1, pWritingFile); 
fwrite(&bmfh.bfOffBits, sizeof(bmfh.bfOffBits), 1, pWritingFile); 
fwrite(&bmih, sizeof(bmih), 1, pWritingFile); 
fwrite(pImageData, imageSize, 1, pWritingFile); 


// End The Process 
fclose(pWritingFile); 
free(pImageData);  
return true; 

Но при сохранении изображения в BMP-файле, который отображается на дисплее, он становится:

https://www.dropbox.com/s/yzus5wiu3shnwm2/IMG_2023%5B1%5D.JPG

ответ

1

Похоже, что запись на диск немного трудно интерпретировать:

// BMP Compress 
fwrite(&bmfh, 8, 1, pWritingFile); 
fwrite(&bmfh.bfReserved2, sizeof(bmfh.bfReserved2), 1, pWritingFile); 
fwrite(&bmfh.bfOffBits, sizeof(bmfh.bfOffBits), 1, pWritingFile); 
fwrite(&bmih, sizeof(bmih), 1, pWritingFile); 
fwrite(pImageData, imageSize, 1, pWritingFile); 

Я не понимаю, почему вы пишете элементы bmfh отдельно, просто убедитесь, что все понятно делая это вместо того, чтобы:

// BMP Compress 
fwrite(&bmfh, sizeof(bmfh), 1, pWritingFile); 
fwrite(&bmih, sizeof(bmih), 1, pWritingFile); 
fwrite(pImageData, imageSize, 1, pWritingFile); 

Если это не имеет никакого значения, то внешний вид вашего изображения является то, что компоненты цвета перепутаны (RGB, а не BGR) - хотя glPixelStorei(GL_PACK_SWAP_BYTES,1) не должен влиять на себя пиксельные данные, то стоило бы пытаться либо это:

glPixelStorei(GL_PACK_SWAP_BYTES,1); 
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pImageData); 

или это:

glPixelStorei(GL_PACK_SWAP_BYTES,0); 
glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pImageData); 
+0

причина я использую Vim/Linux для моего редактора, если я используйте fwrite (& bmfh, sizeof (bmfh ..)), это может вызвать проблему преждевременного окончания файла. –

+0

Я пытаюсь использовать glPixelStorei (GL_PACK_SWAP_BYTES, 1); glReadPixels (.., GL_RGB, ..); , но похоже, что все еще есть цветовое искажение https://www.dropbox.com/s/9spewhbmm4f4ggb/renderedframes-3.bmp –