Linux(ubuntu系统)下使用FreeImage库

Linux(ubuntu系统)下使用FreeImage库

最近在搞一个图像处理的项目,需要用到FreeImage,之前在Windows下用过,很简单,因为FreeImage官网提供了可供使用的静态库动态库,直接包含就行了。现在需要在Linux平台下使用,发现官网并没有提供直接编译好的库,需要自己编译。安装过程也遇到好几个大坑,所幸终于解决了。记录一下自己下载编译安装的步骤:

1. 下载FreeImage源码

http://freeimage.sourceforge.net/download.html

这是官网,选择下面这个

Source distribution

Source distribution includes source for FreeImage, C++, C#, Delphi and VB6 wrappers, examples and the internally used libraries LibTIFF, LibJPEG, LibPNG, ZLib, OpenEXR, OpenJPEG, LibRaw, LibJXR and LibWebP.

Download FreeImage 3.17.0

下载即可!下载完解压得到FreeImage这个文件夹。

2. 既然是要自己编译,那么肯定是要用到makefile文件,打开FreeImage文件夹可以看到里面有很多makefile的文件,只是后缀不一样罢了:

这些其实只是给不同的系统环境下用的而已,继续在文件夹中找可以看到一个叫做“README.linux”的文件,这就是关于在linux下如何安装使用的说明文档了,打开它,按照里面的说明来操作。

摘录一些重要的信息:

1)为了编辑和使用FreeImage库,你不需要在你的电脑/usr/lib directory目录下安装任何third party libraries。

2)为了避免internal third party libraries和系统库之间的不兼容,FreeImage makefile使用了gcc的

"-fvisibility=hidden"选项,如果你使用的是老版本的gcc,你可能得先移除这个选项

3)在库编辑安装之后,你应该可以使用-lfreeimage option来link programs。You can also statically link with libfreeimage.a.

4) 安装FreeImage

------------

注意:你需要获得root权限才可以在/usr/lib目录下安装库

安装步骤很简单,如下:

1) Enter the FreeImage directory

2) Build the distribution :

make

make install

3) Clean all files produced during the build process

make clean

可以看到,安装使用的方式其实很简单,就是

(1)在FreeImage的目录下右键打开终端,先输入make命令进行编译。

(2)编译好之后使用make install将编译好的头文件FreeImage.h写进系统的/usr/include目录下,把库文件libfreeimage.o给写进系统的/usr/lib目录下。

(3)然后执行make clean清除刚才编译生成的那些中间文件即可。

但是!!!并没有想当然的那么简单,首先输入make命令是正常在编译了,但是编译完之后提示了下面的错误:

dsp.upsampling_mips_dsp_r2.o

Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:34: error: invalid character ' ' in raw string delimiter

"shll_s.w %["#R"], %["#R"], 9 \n\t"

^

Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:37:48: error: invalid character ' ' in raw string delimiter

"shll_s.w %["#R"], %["#R"], 9 \n\t"

^

Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:40:34: error: invalid character ' ' in raw string delimiter

"precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t"

^

Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:40:48: error: invalid character ' ' in raw string delimiter

"precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t"

^

Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:43:34: error: invalid character ' ' in raw string delimiter

"srl %["#R"], %["#R"], 24 \n\t"

^

Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.c:43:48: error: invalid character ' ' in raw string delimiter

"srl %["#R"], %["#R"], 24 \n\t"

^

Makefile.gnu:61: recipe for target 'Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.o' failed

make[1]: *** [Source/LibWebP/./src/dsp/dsp.upsampling_mips_dsp_r2.o] Error 1

make[1]: Leaving directory '/home/jianqiang/Documents/FreeImage'

Makefile:21: recipe for target 'default' failed

make: *** [default] Error 2

Error的内容是invalid character '' ub raw string delimiter.意思是原始字符串分隔符中有无效字符。产生这个错误的原因是编译器支持了C++11的新标准,在C++ 11中引入了原始字符串这样一个新特性:使用''R''等方式来定义一个不进行转义的字符串。而在FreeImage的一些代码中,却使用了R作为一些宏函数的参考,所以在FreeImage中那些被当成了原始字符串,从而产生了错误。

定位到提示错误的文件dsp.unsampling_mips_dsp_r2.c,打开之后找到对应的错误行,是下面这些:

#if !defined(WEBP_YUV_USE_TABLE)

#define YUV_TO_RGB(Y, U, V, R, G, B) do { \

const int t1 = kYScale * Y; \

const int t2 = kVToG * V; \

R = kVToR * V; \

G = kUToG * U; \

B = kUToB * U; \

R = t1 + R; \

G = t1 - G; \

B = t1 + B; \

R = R + kRCst; \

G = G - t2 + kGCst; \

B = B + kBCst; \

__asm__ volatile ( \

"shll_s.w %["#R"], %["#R"], 9 \n\t" \

"shll_s.w %["#G"], %["#G"], 9 \n\t" \

"shll_s.w %["#B"], %["#B"], 9 \n\t" \

"precrqu_s.qb.ph %["#R"], %["#R"], $zero \n\t" \

"precrqu_s.qb.ph %["#G"], %["#G"], $zero \n\t" \

"precrqu_s.qb.ph %["#B"], %["#B"], $zero \n\t" \

"srl %["#R"], %["#R"], 24 \n\t" \

"srl %["#G"], %["#G"], 24 \n\t" \

"srl %["#B"], %["#B"], 24 \n\t" \

: [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \

: \

); \

} while (0)

出现错误的地方就是所有的带有 R"] 的位置,解决方法很简单,把R换成Red即可。

#if !defined(WEBP_YUV_USE_TABLE)

#define YUV_TO_RGB(Y, U, V, Red, G, B) do { \

const int t1 = kYScale * Y; \

const int t2 = kVToG * V; \

Red = kVToR * V; \

G = kUToG * U; \

B = kUToB * U; \

Red = t1 + Red; \

G = t1 - G; \

B = t1 + B; \

Red = Red + kRCst; \

G = G - t2 + kGCst; \

B = B + kBCst; \

__asm__ volatile ( \

"shll_s.w %["#Red"], %["#Red"], 9 \n\t" \

"shll_s.w %["#G"], %["#G"], 9 \n\t" \

"shll_s.w %["#B"], %["#B"], 9 \n\t" \

"precrqu_s.qb.ph %["#Red"], %["#Red"], $zero \n\t" \

"precrqu_s.qb.ph %["#G"], %["#G"], $zero \n\t" \

"precrqu_s.qb.ph %["#B"], %["#B"], $zero \n\t" \

"srl %["#Red"], %["#Red"], 24 \n\t" \

"srl %["#G"], %["#G"], 24 \n\t" \

"srl %["#B"], %["#B"], 24 \n\t" \

: [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \

: \

); \

} while (0)

修改完这个文件中的错误,和刚才那个文件在同一个目录下还有一个会出现同样错误的文件:dsp.yuv_mips_dsp_r2.c

这个的错误出现在第75行的"#R"(%[dst])

"shll_s.w %[temp7], %[temp7], 9 \n\t" \

"precrqu_s.qb.ph %[temp5], %[temp5], $zero \n\t" \

"precrqu_s.qb.ph %[temp6], %[temp6], $zero \n\t" \

"precrqu_s.qb.ph %[temp7], %[temp7], $zero \n\t" \

"srl %[temp5], %[temp5], 24 \n\t" \

"srl %[temp6], %[temp6], 24 \n\t" \

"srl %[temp7], %[temp7], 24 \n\t" \

"sb %[temp5], "#R"(%[dst]) \n\t" \

"sb %[temp6], "#G"(%[dst]) \n\t" \

"sb %[temp7], "#B"(%[dst]) \n\t" \

同样按照上面的方式把R用Red替换即可。

保存修改,然后重新打开终端窗口输入:make。

这些就会执行成功了!为了验证我们可以打开FreeImage/Dist文件夹,会发现下面生成了3个文件:

FreeImage.h就是头文件,libfreeimage.a就是linux版本的库文件(Windows下同下是.lib)。

3. 其实进行到上面这一步,那两个文件你就可以拿去用了,用来编写自己的程序什么的。但是如果你要在本机上写一些代码来用,那就需要在本机上安装一下FreeImage,说是安装,其实就是执行了两次拷贝操作而已:

把FreeImage.h文件写入到系统目录/usr/include文件夹下

把libfreeimage.a写入到系统目录/usr/lib文件夹下

当然,你不需要自己亲手来进行写入,因为并不是直接复制粘贴就可以,linux系统下的系统目录你没有root权限是没办法直接复制粘贴文件的。我们直接使用命令就好,在终端继续输入:

sudo make install

系统就会自动执行上面的两个操作了,sudo是获取root权限的意思,如果你按照官网文档说明只使用make install,是会报错提示你要先获取root权限的,所以直接使用上面的命令就好。

4. 最后我们执行一次

make clean

将刚才编译过程中生成的中间文件都删除掉就可以了。

Linux(ubuntu系统)下使用FreeImage库相关教程

linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库相关推荐

  1. ubuntu下的linux怎样备份文件,Ubuntu系统如何备份还原?Ubuntu系统备份还原教程

    Ubuntu系统如何备份还原?Ubuntu系统是一个以桌面应用为主的开源操作系统,专为开发团队而打造!无论你使用的是什么操作系统,都有可能出现电脑无法修复的故障,这时候备份还原功能就显得非常重要了.今 ...

  2. linux系统vi替换命令,linux:vi 替换命令

    转自:http://www.cnblogs.com/afant/archive/2009/03/11/1408745.html :s/^.*$/\L&/100 ##将100行内的小写转换成大写 ...

  3. linux里面查找替换命令,LINUX 查找替换命令 总结

    find /var/ -name "*.php" > /home/tmp 在/var/目录下查找 所有以.php后缀结尾的文件  结果很多,就 > 输出结果到/home ...

  4. linux系统下qt中文输入法,Ubuntu系统下Qt使用中文输入法(示例代码)

    近几个月一直在搞QML框架下的UI控件,没有更新博客.今天记录下Ubuntu系统下Qt开发工具使用中文输入法的流程. (题外话,Linux系统下的开发,离线是没法搞的(夸张手法),不联网简直就是事倍功 ...

  5. 当前linux环境做出镜像,把当前ubuntu系统做成镜像

    Systemback是一个很好的备份还原软件.用它还可以生成自己的linux系统镜像文件,所以我们这里使用Systemback来制作UBuntu的镜像文件. 1 安装Systemback 在开始之前我 ...

  6. linux如何启动网络配置文件,linux系统的网络配置教程 Ubuntu系统网络设置方法网络配置linux及Ubuntu通过修改配置文件进行网络配置...

    Windows系统网络配置方法 一.设置网络 1)Windows打开cmdcmd 输入ipconfig  /all 可以看到 修改为静态IP Ubuntu修改网络为静态IP 设置虚拟机: 查看IPif ...

  7. linux mint卸载桌面环境,在Ubuntu系统中安装最新Cinnamon桌面环境,包括启用及卸载...

    Cinnamon 桌面环境通常默认装载在 Linux Mint 版本中,它是一个传统而优雅的桌面环境,本文将为你介绍在 Ubuntu 下安装最新 Cinnamon 桌面环境的方法,包括启用及卸载方法, ...

  8. 【Linux 虚拟机】VMware虚拟机安装Ubuntu系统英文改中文的方法

    繁體 VMware虚拟机安装Ubuntu系统英文改中文的方法 我们已经在Windows 7下用VMware Workstation 10虚拟机安装 Ubunbu 14.04. (本文更新http:// ...

  9. linux清理页面缓存文件夹,清理Ubuntu系统的缓存、垃圾、多余内核。

    linux和windows系统不同,linux不会产生无用垃圾文件,但是在升级缓存中,linux不会自动删除这些文件,还是很占硬盘的! 一.删除缓存 1,非常有用的清理命令:sudo apt-get ...

最新文章

  1. mem 族函数的实现
  2. 关于MYSQL日期 字符串 时间戳互转
  3. php查询socket数据包头,php 查询数组值php中关于socket的系列函数总结
  4. python大杀器之requests安装
  5. FlexPaper 2.2.1介绍与提取嵌入的文档
  6. shell脚本单词去重多个文件
  7. 鸿蒙系统 安卓游戏,华为鸿蒙系统运行安卓游戏出现新状况!安卓换皮论被彻底打脸?...
  8. javascript 的位操作符转换推断
  9. Tensorflow2.0实战之GAN
  10. 计算不确定度的小工具
  11. 计算机桌面成英文怎样变成中文版,电脑系统菜单全变成英文怎么办
  12. 我为什么选择了自然码?
  13. 梦幻西游进入游戏显示服务器程序停止工作,win7系统提示“梦幻西游已停止工作”的解决方法...
  14. 国庆高质量出行,可视化开启智慧旅游
  15. UID/DID/SID总结
  16. ESP32学习【2】——ESP32固件烧录及相关问题解决
  17. Mathematica描绘滚球某个点的运动轨迹(摆线)
  18. linux mtd设备使用
  19. 深入理解浏览器兼容性模式
  20. STM32_RS485通信异常

热门文章

  1. LeetCode677. 键值映射(Trie树)
  2. html使用js的变量_2、温故而知新,再学一遍JavaScript-html中如何使用JS
  3. springboot listener_Springboot 监听redis key的过期事件
  4. php转调页面,PHP中HTTP防盗链技术
  5. Jquery练习题—实现分组添加功能
  6. linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上
  7. 李宏毅机器学习(九)Multi-lingual BERT
  8. 卖萌屋学术站发布!通往高效刷论文之路
  9. 模型训练太慢?显存不够用?这个算法让你的GPU老树开新花
  10. APPKIT打造稳定、灵活、高效的运营配置平台