bool AUX_RGBImageRec::loadFile(const char* Filename) { BITMAPINFO BMInfo; // need the current OpenGL device contexts in order to make use of windows DIB utilities const HDC gldc = wglGetCurrentDC(); // a handle for the current OpenGL Device Contexts // assume there are errors until file is loaded successfully into memory NoErrors = false; // release old data since this object could be used to load multiple Textures if(data != NULL) delete data; // windows needs this info to determine what header info we are looking for BMInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); // Get windows to determine color bit depth in the file for us BMInfo.bmiHeader.biBitCount = 0; // Get windows to open and load the BMP file and handle the messy decompression if the file is compressed // assume perfect world and no errors in reading file, Ha Ha HANDLE DIBHandle = LoadImage(0,Filename, IMAGE_BITMAP, 0, 0,LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE); // use windows to get header info of bitmap - assume no errors in header format GetDIBits(gldc, (HBITMAP)DIBHandle, 0,0, NULL, &BMInfo, DIB_RGB_COLORS); sizeX = BMInfo.bmiHeader.biWidth; sizeY = BMInfo.bmiHeader.biHeight; // change color depth to 24 bits (3 bytes (BGR) / pixel) BMInfo.bmiHeader.biBitCount = 24; // don't want the data compressed BMInfo.bmiHeader.biCompression = BI_RGB; const DWORD BitmapLength = sizeX * sizeY * 3; // 3 bytes (BGR) per pixel (24bp) // allocate enough memory to hold the pixel data in client memory data = new byte[BitmapLength]; // Get windows to do the dirty work of converting the BMP into the format needed by OpenGL // if file is already 24 bit color then this is a waste of time but makes for short code // Get the actual Texel data from the BMP object if (GetDIBits(gldc, (HBITMAP)DIBHandle, 0, sizeY, data, &BMInfo, DIB_RGB_COLORS)) { NoErrors = true; convertBGRtoRGB(); // NOTE: BMP is in BGR format but OpenGL needs RGB unless you use GL_BGR_EXT } DeleteObject(DIBHandle); // don't need the BMP Object anymore return NoErrors; }
void QNode::imageCallback2(const sensor_msgs::ImageConstPtr& msg) { QImage::Format format = QImage::Format_Indexed8; unsigned char *newData = 0; if(msg->encoding == "bgr8") { format = QImage::Format_RGB888; newData = convertBGRtoRGB(&msg->data[0], msg->step * msg->height); } if(msg->encoding == "rgb8") format = QImage::Format_RGB888; if(msg->encoding == "mono16") ROS_WARN("The OCS does not currently support 16bpp images. This image topic will not render correctly."); QImage img(msg->encoding == "bgr8" ? newData : &msg->data[0], msg->width, msg->height, msg->step, format); if(!pthread_mutex_trylock(&m_imageMutex)) { if(m_firewireImage2.convertFromImage(img)) { emit newImage2(); } pthread_mutex_unlock(&m_imageMutex); } if(newData != 0) delete newData; }