FreeImage是个免费的开源图片开发库,用他可以读取JPG、BMP、PNG、TGA、GIF等20多种常用图片格式。他还有一个好处,跨平台。
FreeImage官网:http://freeimage.sourceforge.net/
FreeImage下载地址:http://sourceforge.net/projects/freeimage/
安装:
目前最新版本是3.17,下载后得到一个zip。解压后就可以使用(不要下载源码,codeblocks编译特麻烦)。解压后出现Freeimage目录,目录里有个DIST目录,里面就有我们编程需要的文件(包括头文件,库文件)。



读取图像文件数据示例
读取图片方法大同小异,按照以下步骤完成,初始化->获取图片格式->打开图片文件->获取像素值->释放。程序如下:
#include <stdio.h> #include <FreeImage.h>//包含头文件 using namespace std; int main() { unsigned char* imgBuf; int width,height; //初始化FreeImage FreeImage_Initialise(TRUE); //定义图片格式为未知 FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; //获取图片格式 fif = FreeImage_GetFileType("test.jpg",0); //根据获取格式读取图片数据 FIBITMAP* bitmap = FreeImage_Load(fif,"test.jpg",0); if(!bitmap) { printf("load error!\n"); return 0; } int x,y; RGBQUAD m_rgb; //获取图片长宽 width = (int)FreeImage_GetWidth(bitmap); height = (int)FreeImage_GetHeight(bitmap); imgBuf = new unsigned char[width*height*4]; //获取图片数据 //按RGBA格式保存到数组中 for(y=0;y<height;y++) { for(x=0;x<width;x++) { //获取像素值 FreeImage_GetPixelColor(bitmap,x,y,&m_rgb); //将RGB值存入数组 imgBuf[y*width*4+x*4+0] = m_rgb.rgbRed; imgBuf[y*width*4+x*4+1] = m_rgb.rgbGreen; imgBuf[y*width*4+x*4+2] = m_rgb.rgbBlue; //判断是否透明图片 //如果是就取alpha值保存 if(FreeImage_IsTransparent(bitmap)) imgBuf[y*width*4+x*4+3] = m_rgb.rgbReserved; else imgBuf[y*width*4+x*4+3] = 255; } } //释放FreeImage FreeImage_Unload(bitmap); return 0; }
生成执行文件后,运行时,切记要把freeimage.dll这个文件也放在一起,不然是运行不了的。
创建图像文件示例
这节我们用FreeImage来创建一张图片。FreeImage能存取多种格式的图片。而且很简单,我们将创建一张256*256的PNG图片,图片上分别有三行RGB颜色。其中Red颜色ALPHA通道是128,即是透明的。
#include <stdio.h> #include <FreeImage.h> //图片大小 #define IMG_WIDTH 256 #define IMG_HEIGHT 256 int main() { int x,y; int mode=0; FreeImage_Initialise(TRUE); //分配图片空间,后面3个8,表示RGB每个的有效位 FIBITMAP* bitmap =FreeImage_Allocate(IMG_WIDTH,IMG_HEIGHT,32,8,8,8); for(y=0;y<FreeImage_GetHeight(bitmap);y++) { //把图片内容分成三份 //每份的颜色分别是RGB //Red的ALPHA是128,也就是0.5 if(y<IMG_HEIGHT/3) mode=0; else if(y<IMG_HEIGHT/3*2) mode=1; else mode=2; BYTE *bits =FreeImage_GetScanLine(bitmap,y); for(x=0;x<FreeImage_GetWidth(bitmap);x++) { if(mode==0) { //blue bits[0] = 255; bits[1] = 0; bits[2] = 0; bits[3] = 255; } else if(mode==1) { //green bits[0] = 0; bits[1] = 255; bits[2] = 0; bits[3] = 255; } else if(mode==2) { //red bits[0] = 0; bits[1] = 0; bits[2] = 255; bits[3] = 128; } bits +=4; } } //保存图片为PNG格式 if(false ==FreeImage_Save(FIF_PNG, bitmap,"123.png", PNG_DEFAULT)) { printf("save image error\n"); } FreeImage_Unload(bitmap); return 0; }

大家会发现图片RGB的顺序是颠倒的,就像我们读取图片信息一样。所以大家在创建图片时一定要注意这个问题。
FreeImage图像编程