Win8.1下FreeImage.lib库的配置和简单使用(转)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Win8.1下FreeImage.lib库的配置和简单使用(转)相关的知识,希望对你有一定的参考价值。

转自http://www.codeweblog.com/win8-1下freeimage-lib库的配置和简单使用/

首先,你可以从这里获取FreeImage的完整库文件(访问密码 9a5e)。



配置过OpenGL的同学,可以直接跳过这个部分,VS中配置FreeImage库和配置OpenGL库的流程完全相似。强调一点的是,虽然本人使用的是win8.1下的VS2013,但是个人觉得win7上下的操作系统或者VS2010以上的VS都可以按照这个步骤级逆行配置。可能有区别的是可能共享的Demo不能够直接运行,但是对于FreeImage的使用应该差不错。所以非win8.1和VS2013的也可以按照下面步骤进行配置然后参考Demo使用该库。

 

  • 首先把FreeImage.h 头文件在"VS安装目录"/VC/include/FreeImage/,FreeImage文件夹需要自己新建;
  • 紧接着把FreeImage.lib静态库扔到"VS安装目录"/VC/lib/中;
  • 最后,把FreeImage.dll动态链接库放在C:\Windows\System32\下(这里C盘为系统盘)。64位的还需要将其放在C:\Windows\SysWOW64\下
  • 到这里简单的配置过程就王完成了。

下面通过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图片,为原先图片旋转后的图片。

技术分享
技术分享

lenna.png lenna_rotate.png

更多关于FreImage的API可以参考下载的资料中的FreeImage中文教程.pdf 。

现在,你可以开始尝试在自己配置好的FreeImage开发环境下进一步学习怎么使用它的API实现你需要的功能。

 

以上是关于Win8.1下FreeImage.lib库的配置和简单使用(转)的主要内容,如果未能解决你的问题,请参考以下文章

Win8.1系统 每次开机就 你已使用临时配置文件 桌面都还原到以前 怎么解决?

Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置

转:PL/SQL在 win8.1系统下连接Oracle11g没有database处理方法

win8.1中vs2015配置opengl环境,那个glut.lib和glut32.lib放哪里啊

win8.1 xampp+composer安装yii2

win8.1 xampp+composer安装yii2