void putBmpIntoPixels(FIBITMAP * bmp, ofPixels_<PixelType> &pix, bool swapForLittleEndian = true) { // convert to correct type depending on type of input bmp and PixelType FIBITMAP* bmpConverted = NULL; FREE_IMAGE_TYPE imgType = FreeImage_GetImageType(bmp); if(sizeof(PixelType)==1 && (FreeImage_GetColorType(bmp) == FIC_PALETTE || FreeImage_GetBPP(bmp) < 8 || imgType!=FIT_BITMAP)) { if(FreeImage_IsTransparent(bmp)) { bmpConverted = FreeImage_ConvertTo32Bits(bmp); } else { bmpConverted = FreeImage_ConvertTo24Bits(bmp); } bmp = bmpConverted; }else if(sizeof(PixelType)==2 && imgType!=FIT_UINT16 && imgType!=FIT_RGB16 && imgType!=FIT_RGBA16){ if(FreeImage_IsTransparent(bmp)) { bmpConverted = FreeImage_ConvertToType(bmp,FIT_RGBA16); } else { bmpConverted = FreeImage_ConvertToType(bmp,FIT_RGB16); } bmp = bmpConverted; }else if(sizeof(PixelType)==4 && imgType!=FIT_FLOAT && imgType!=FIT_RGBF && imgType!=FIT_RGBAF){ if(FreeImage_IsTransparent(bmp)) { bmpConverted = FreeImage_ConvertToType(bmp,FIT_RGBAF); } else { bmpConverted = FreeImage_ConvertToType(bmp,FIT_RGBF); } bmp = bmpConverted; } unsigned int width = FreeImage_GetWidth(bmp); unsigned int height = FreeImage_GetHeight(bmp); unsigned int bpp = FreeImage_GetBPP(bmp); unsigned int channels = (bpp / sizeof(PixelType)) / 8; unsigned int pitch = FreeImage_GetPitch(bmp); // ofPixels are top left, FIBITMAP is bottom left FreeImage_FlipVertical(bmp); unsigned char* bmpBits = FreeImage_GetBits(bmp); if(bmpBits != NULL) { pix.setFromAlignedPixels((PixelType*) bmpBits, width, height, channels, pitch); } else { ofLogError("ofImage") << "putBmpIntoPixels(): unable to set ofPixels from FIBITMAP"; } if(bmpConverted != NULL) { FreeImage_Unload(bmpConverted); } #ifdef TARGET_LITTLE_ENDIAN if(swapForLittleEndian && sizeof(PixelType) == 1) { pix.swapRgb(); } #endif }
BOOL fipImage::convertToType(FREE_IMAGE_TYPE image_type, BOOL scale_linear) { if(_dib) { FIBITMAP *dib = FreeImage_ConvertToType(_dib, image_type, scale_linear); return replace(dib); } return FALSE; }
bool FreeimagelibPlugin::LoadDoc(cpcl::IOStream *input, plcl::Doc **r) { FREE_IMAGE_FORMAT fif = (FREE_IMAGE_FORMAT)freeimagelib_format; FreeimagelibStuff stuff(input); boost::shared_ptr<FIBITMAP> fibitmap(FreeImage_LoadFromHandle(fif, &stuff.io, stuff.io_handle), FreeImage_Unload); if (!fibitmap) { cpcl::Error(cpcl::StringPieceFromLiteral("FreeimagelibPlugin::LoadDoc(): unable to load image")); return false; } if (FreeImage_GetImageType(fibitmap.get()) != FIT_BITMAP) { boost::shared_ptr<FIBITMAP> tmp(FreeImage_ConvertToType(fibitmap.get(), FIT_BITMAP), FreeImage_Unload); if (!tmp || (FreeImage_GetImageType(tmp.get()) != FIT_BITMAP)) { cpcl::Error(cpcl::StringPieceFromLiteral("FreeimagelibPlugin::LoadDoc(): unable to convert the image to FIT_BITMAP")); return false; } fibitmap = tmp; } unsigned int const bpp = FreeImage_GetBPP(fibitmap.get()); if (!(bpp == 24 || bpp == 32)) { boost::shared_ptr<FIBITMAP> tmp((bpp > 32) ? FreeImage_ConvertTo32Bits(fibitmap.get()) : FreeImage_ConvertTo24Bits(fibitmap.get()), FreeImage_Unload); if (!tmp) { cpcl::Trace(CPCL_TRACE_LEVEL_ERROR, "FreeimagelibPlugin::LoadDoc(): unable to convert image with bpp %u", bpp); } fibitmap = tmp; } if (r) *r = new FreeimagelibDoc(fibitmap); return true; }
static void TestFIA_GreyscaleU16bitElipseTest(CuTest* tc) { const char *file = TEST_DATA_DIR "drone-bee-greyscale.jpg"; FIBITMAP *src = FIA_LoadFIBFromFile(file); CuAssertTrue(tc, src != NULL); FIBITMAP *src2 = FreeImage_ConvertToType(src, FIT_UINT16, 1); FIARECT rect; rect.left = 100; rect.top = 100; rect.bottom = 200; rect.right = 300; FIA_DrawSolidGreyscaleEllipse (src2, rect, 200, 1); FIA_SaveFIBToFile(src2, TEST_DATA_OUTPUT_DIR "Drawing/TestFIA_GreyscaleU16bitElipseTest.bmp", BIT8); FreeImage_Unload(src); FreeImage_Unload(src2); }