轉載地址 http://www.codeweblog.com/win8-1%E4%B8%8Bfreeimage-lib%E5%BA%93%E7%9A%84%E9%85%8D%E7%BD%AE%E5%92%8C%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8/
配置過OpenGL的同學,可以直接跳過這個部分,VS中配置FreeImage庫和配置OpenGL庫的流程完全相似。使用的是win7下的VS2013,可以按照下面步驟進行配置然后參考Demo使用該庫。
- 首先把FreeImage.h 頭文件在"VS安裝目錄"/VC/include/FreeImage/,FreeImage文件夾需要自己新建;
- 緊接着把FreeImage.lib靜態庫扔到"VS安裝目錄"/VC/lib/中;
- 最后,把FreeImage.dll動態鏈接庫放在應用程序的目錄下
- 到這里簡單的配置過程就王完成了。
下面通過Demo來介紹一下FreeImage的一些基本用法,包括圖片的加載,獲取圖片的像素數組,圖片保存等。
int main(){ // 初始化 FreeImage_Initialise(TRUE); // 文件名 const char* imageFile = "lenna.png"; const char* saveFile = "lenna_rotate.png"; // 圖片格式 FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; // 獲取圖片格式 /* 此處需要特別注意,即使后綴名是.png並不代表圖片格式就真是PNG格式,這里先通過FreeImage_GetFileType函數獲取圖片格式, 然后再進行加載,否則,也許會出現加載失敗的情況。 */ fif = FreeImage_GetFileType(imageFile); if (fif == FIF_UNKNOWN) fif = FreeImage_GetFIFFromFilename(imageFile); FIBITMAP *bitmap1 = NULL; FIBITMAP *bitmap2 = NULL; if ((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif)){ bitmap1 = FreeImage_Load(fif, imageFile, PNG_DEFAULT); } if (!bitmap1){ fprintf(stderr, "Fail to Load Image!\n"); exit(-1); } else{ FreeImage_Save(fif, bitmap1, saveFile, PNG_DEFAULT); bitmap2 = FreeImage_Load(fif, saveFile, PNG_DEFAULT); if (!bitmap2){ fprintf(stderr, "Fail to Load saved Image!\n"); exit(-1); } } // 獲取影像的寬高,都以像素為單位 int width = FreeImage_GetWidth(bitmap1); int height = FreeImage_GetHeight(bitmap1); // 獲取總共的像素數目 int pixel_num = width*height; // 獲取保存每個像素的字節數 這里為3,分別為RGB unsigned int byte_per_pixel = FreeImage_GetLine(bitmap1) / width; printf("Width:%d\t Height:%d\t 像素總數:%d\t 每像素字節數:%d\n", width, height, pixel_num, byte_per_pixel); // 獲取保存圖片的字節數組 unsigned char *bits1 = FreeImage_GetBits(bitmap1); unsigned char *bits2 = FreeImage_GetBits(bitmap2); // 獲取每個像素對應的RGB unsigned char *reds = new unsigned char[pixel_num]; unsigned char *greens = new unsigned char[pixel_num]; unsigned char *blues = new unsigned char[pixel_num]; int cur = 0; for (int x = 0; x < pixel_num; ++x){ // 這里對應於上述的每個像素的字節數:3 reds[x] = bits1[cur++]; greens[x] = bits1[cur++]; blues[x] = bits1[cur++]; } // 反序更新saveFile的字節數組 cur = 0; for (int x = pixel_num - 1; x >= 0; --x){ bits2[cur++] = reds[x]; bits2[cur++] = greens[x]; bits2[cur++] = blues[x]; } // 保存更新后的圖片 FreeImage_Save(fif, bitmap2, saveFile, PNG_DEFAULT); // 從內存中刪除載入圖片,防止內存泄漏 FreeImage_Unload(bitmap1); FreeImage_Unload(bitmap2); // 撤銷初始化 FreeImage_DeInitialise(); return 0; }
上述代碼運行后會在給定工程下的testFreeImage/下生成lenna_rotate.png圖片,為原先圖片旋轉后的圖片。