BOOL fipImage::convertTo16Bits565() { if(_dib) { FIBITMAP *dib16_565 = FreeImage_ConvertTo16Bits565(_dib); return replace(dib16_565); } return FALSE; }
/** * Helper to encapsulate Bpp conversion using FreeImage, taking into consideration color type. Creates a new bitmap if needed. Can return the same one. * @param pHandle FIBITMAP as defined by the Freeimage library. * @param pNewBpp the new bpp that the supplied FIBITMAP is to be coverted to. */ FIBITMAP* FreeImageHelper::convertBpp(FIBITMAP* pHandle, int pNewBpp) { //Convert the bit depth FIBITMAP *converted = NULL; //Convert Bpp only if needed if (pNewBpp != static_cast<int>(FreeImage_GetBPP(pHandle))) { //Transform bpp to the pixel format switch (pNewBpp) { case (4): converted = FreeImage_ConvertTo4Bits(pHandle); break; case (8): converted = FreeImage_ConvertTo8Bits(pHandle); break; case(16): converted = FreeImage_ConvertTo16Bits565(pHandle); //There's option of 16Bits555. But leaves unused bits. Chosen 565 because it's most common break; case(24): converted = FreeImage_ConvertTo24Bits(pHandle); break; case(32): { converted = FreeImage_ConvertTo32Bits (pHandle); } break; default: converted = NULL; break; } } else { //No change, just set 'converted' handle to current one converted = pHandle; } return converted; }
/** * Helper to encapsulate color conversion using FreeImage, taking into consideration bpp and original color type. * @param pHandle FIBITMAP as defined by the Freeimage library. * @param pNewFormat IndieLib colorformat to convert to. */ FIBITMAP* FreeImageHelper::convertColorFormat(FIBITMAP* pHandle, int pNewFormat) { int colorFormat = FreeImageHelper::calculateINDFormat(pHandle); if (colorFormat == pNewFormat) return pHandle; FIBITMAP* converted (NULL); //TODO: Simplified version only accepts pNewFormat as IND_RGB or IND_RGBA //Expand it to convert to any format needed if (pNewFormat != IND_RGB && pNewFormat != IND_RGBA) return NULL; //Check target format switch (pNewFormat) { case IND_LUMINANCE: //TODO break; case IND_COLOUR_INDEX: break; case IND_RGB: if (IND_COLOUR_INDEX == colorFormat) { converted = FreeImage_ConvertTo16Bits565(pHandle); } else { converted = FreeImage_ConvertTo24Bits(pHandle); } break; case IND_RGBA: if (IND_COLOUR_INDEX == colorFormat) { converted = FreeImage_ConvertTo24Bits(pHandle); } else { converted = FreeImage_ConvertTo32Bits(pHandle); } break; default: g_debug->header("INCORRECT TEXTURE COLOR FORMAT SPECIFIED TO CONVERT TO", 2); break; } return converted; }
void poImage::setNumChannels(uint c) { if(isValid() && FreeImage_GetBPP(bitmap) != c*8) { FIBITMAP *dst = NULL; switch(c) { case 1: dst = FreeImage_ConvertTo8Bits(bitmap); break; case 2: dst = FreeImage_ConvertTo16Bits565(bitmap); break; case 3: dst = FreeImage_ConvertTo24Bits(bitmap); break; case 4: dst = FreeImage_ConvertTo32Bits(bitmap); break; } FreeImage_Unload(bitmap); bitmap = dst; } }
int main(int argc, char *argv[]) { GtkWidget *window, *imagebox; GdkVisual *visual; GdkImage *image; FIBITMAP *dib; int y; // initialize the FreeImage library FreeImage_Initialise(); dib = FreeImage_Load(FIF_PNG, "freeimage.png", PNG_DEFAULT); gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy), NULL); visual = gdk_visual_get_system(); image = gdk_image_new(GDK_IMAGE_NORMAL,visual, FreeImage_GetWidth(dib),FreeImage_GetHeight(dib)); g_print("picture: %d bpp\n" "system: %d bpp byteorder: %d\n" " redbits: %d greenbits: %d bluebits: %d\n" "image: %d bpp %d bytes/pixel\n", FreeImage_GetBPP(dib), visual->depth,visual->byte_order, visual->red_prec,visual->green_prec,visual->blue_prec, image->depth,image->bpp ); if (FreeImage_GetBPP(dib) != (image->bpp << 3)) { FIBITMAP *ptr; switch (image->bpp) { case 1: ptr = FreeImage_ConvertTo8Bits(dib); break; case 2: if (image->depth == 15) { ptr = FreeImage_ConvertTo16Bits555(dib); } else { ptr = FreeImage_ConvertTo16Bits565(dib); } break; case 3: ptr = FreeImage_ConvertTo24Bits(dib); break; default: case 4: ptr = FreeImage_ConvertTo32Bits(dib); break; } FreeImage_Unload(dib); dib = ptr; } //makes it upside down :( // memcpy(image->mem, FreeImage_GetBits(dib), image->bpl * image->height); BYTE *ptr = FreeImage_GetBits(dib); for (y = 0; y < image->height; y++) { memcpy(image->mem + (y * image->bpl), ptr + ((image->height - y - 1) * image->bpl), image->bpl); } FreeImage_Unload(dib); imagebox = gtk_image_new(image, NULL); gtk_container_add(GTK_CONTAINER(window), imagebox); gtk_widget_show(imagebox); gtk_widget_show(window); gtk_main(); // release the FreeImage library FreeImage_DeInitialise(); return 0; }