// ========================================================== // Multipage functions demonstration // // Design and implementation by // - Hervé Drolon // // This file is part of FreeImage 3 // // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER // THIS DISCLAIMER. // // Use at own risk! // ========================================================== // This sample shows how to clone a multipage TIFF // // Functions used in this sample : // FreeImage_OpenMultiBitmap, FreeImage_GetPageCount, FreeImage_LockPage, // FreeImage_AppendPage, FreeImage_UnlockPage, FreeImage_CloseMultiBitmap; // FreeImage_SetOutputMessage // // ========================================================== #include #include #include #include "FreeImage.h" // ---------------------------------------------------------- /** FreeImage error handler */ void MyMessageFunc(FREE_IMAGE_FORMAT fif, const char *message) { cout << "\n*** " << message << " ***\n"; cout.flush(); } // ---------------------------------------------------------- bool CloneMultiPage(FREE_IMAGE_FORMAT fif, char *input, char *output, int output_flag) { BOOL bMemoryCache = TRUE; // Open src file (read-only, use memory cache) FIMULTIBITMAP *src = FreeImage_OpenMultiBitmap(fif, input, FALSE, TRUE, bMemoryCache); if(src) { // Open dst file (creation, use memory cache) FIMULTIBITMAP *dst = FreeImage_OpenMultiBitmap(fif, output, TRUE, FALSE, bMemoryCache); // Get src page count int count = FreeImage_GetPageCount(src); // Clone src to dst for(int page = 0; page < count; page++) { // Load the bitmap at position 'page' FIBITMAP *dib = FreeImage_LockPage(src, page); if(dib) { // add a new bitmap to dst FreeImage_AppendPage(dst, dib); // Unload the bitmap (do not apply any change to src) FreeImage_UnlockPage(src, dib, FALSE); } } // Close src FreeImage_CloseMultiBitmap(src, 0); // Save and close dst FreeImage_CloseMultiBitmap(dst, output_flag); return true; } return false; } int main(int argc, char *argv[]) { char *input_filename = "images\\input.tif"; char *output_filename = "images\\clone.tif"; // call this ONLY when linking with FreeImage as a static library #ifdef FREEIMAGE_LIB FreeImage_Initialise(); #endif // FREEIMAGE_LIB // initialize our own FreeImage error handler FreeImage_SetOutputMessage(MyMessageFunc); // Copy 'input.tif' to 'clone.tif' CloneMultiPage(FIF_TIFF, input_filename, output_filename, 0); // call this ONLY when linking with FreeImage as a static library #ifdef FREEIMAGE_LIB FreeImage_DeInitialise(); #endif // FREEIMAGE_LIB return 0; }