VALUE rb_graffik_cropped_thumbnail(VALUE self, VALUE rb_size) { // Convert the Ruby numbers to C numbers int size = FIX2INT(rb_size); // Load our image FIBITMAP *image = get_instance_image(self); // Get dimensions int width = FreeImage_GetWidth(image), height = FreeImage_GetHeight(image); int left = 0, top = 0, right = width, bottom = height; int half = (width - height) / 2; if (width > height) { left = half; right = half + height; } if (height > width) { top = half; bottom = half + width; } // Crop the image FIBITMAP *cropped = FreeImage_Copy(image, left, top, right, bottom); // Resize the image FIBITMAP *thumbnail = FreeImage_MakeThumbnail(cropped, size, TRUE); // Create a new instance for Ruby VALUE instance = Data_Wrap_Struct(CLASS_OF(self), NULL, NULL, thumbnail); rb_iv_set(instance, "@file_type", rb_iv_get(self, "@file_type")); // If a block is given, yield to it, if not, return the instance if (rb_block_given_p()) { return rb_ensure(rb_yield, instance, rb_graffik_close, instance); } else { return instance; } }
HBITMAP BmpFilterLoadBitmap(BOOL *bIsTransparent, const wchar_t *ptszFilename) { FIBITMAP *dib = (FIBITMAP*)Image_Load(ptszFilename, IMGL_RETURNDIB); if (dib == nullptr) return nullptr; FIBITMAP *dib32 = nullptr; if (FreeImage_GetBPP(dib) != 32) { dib32 = FreeImage_ConvertTo32Bits(dib); FreeImage_Unload(dib); } else dib32 = dib; if (dib32 == nullptr) return nullptr; if (FreeImage_IsTransparent(dib32)) if (bIsTransparent) *bIsTransparent = TRUE; if (FreeImage_GetWidth(dib32) > 128 || FreeImage_GetHeight(dib32) > 128) { FIBITMAP *dib_new = FreeImage_MakeThumbnail(dib32, 128, FALSE); FreeImage_Unload(dib32); if (dib_new == nullptr) return nullptr; dib32 = dib_new; } HBITMAP bitmap = FreeImage_CreateHBITMAPFromDIB(dib32); FreeImage_Unload(dib32); FreeImage_CorrectBitmap32Alpha(bitmap, FALSE); return bitmap; }
VALUE rb_graffik_thumbnail(VALUE self, VALUE rb_size) { // Convert the Ruby numbers to C numbers int size = FIX2INT(rb_size); // Load our image FIBITMAP *image = get_instance_image(self); // Resize the image FIBITMAP *thumbnail = FreeImage_MakeThumbnail(image, size, TRUE); // Create a new instance for Ruby VALUE instance = Data_Wrap_Struct(CLASS_OF(self), NULL, NULL, thumbnail); rb_iv_set(instance, "@file_type", rb_iv_get(self, "@file_type")); // If a block is given, yield to it, if not, return the instance if (rb_block_given_p()) { return rb_ensure(rb_yield, instance, rb_graffik_close, instance); } else { return instance; } }
BOOL fipImage::makeThumbnail(WORD max_size, BOOL convert) { if(_dib) { switch(FreeImage_GetImageType(_dib)) { case FIT_BITMAP: case FIT_UINT16: case FIT_RGB16: case FIT_RGBA16: case FIT_FLOAT: case FIT_RGBF: case FIT_RGBAF: break; default: return FALSE; break; } // Perform downsampling FIBITMAP *dst = FreeImage_MakeThumbnail(_dib, max_size, convert); return replace(dst); } return FALSE; }