FreeImage图像编程

FreeImage是个免费的开源图片开发库,用他可以读取JPG、BMP、PNG、TGA、GIF等20多种常用图片格式。他还有一个好处,跨平台。

FreeImage官网:http://freeimage.sourceforge.net/
FreeImage下载地址:http://sourceforge.net/projects/freeimage/


安装:

目前最新版本是3.17,下载后得到一个zip。解压后就可以使用(不要下载源码,codeblocks编译特麻烦)。解压后出现Freeimage目录,目录里有个DIST目录,里面就有我们编程需要的文件(包括头文件,库文件)。

Dist目录里的文件
Codeblocks编译配置1
Codeblocks编译配置2

读取图像文件数据示例

读取图片方法大同小异,按照以下步骤完成,初始化->获取图片格式->打开图片文件->获取像素值->释放。程序如下:

#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图像编程
滚动到顶部