linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库
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库相关推荐
- ubuntu下的linux怎样备份文件,Ubuntu系统如何备份还原?Ubuntu系统备份还原教程
Ubuntu系统如何备份还原?Ubuntu系统是一个以桌面应用为主的开源操作系统,专为开发团队而打造!无论你使用的是什么操作系统,都有可能出现电脑无法修复的故障,这时候备份还原功能就显得非常重要了.今 ...
- linux系统vi替换命令,linux:vi 替换命令
转自:http://www.cnblogs.com/afant/archive/2009/03/11/1408745.html :s/^.*$/\L&/100 ##将100行内的小写转换成大写 ...
- linux里面查找替换命令,LINUX 查找替换命令 总结
find /var/ -name "*.php" > /home/tmp 在/var/目录下查找 所有以.php后缀结尾的文件 结果很多,就 > 输出结果到/home ...
- linux系统下qt中文输入法,Ubuntu系统下Qt使用中文输入法(示例代码)
近几个月一直在搞QML框架下的UI控件,没有更新博客.今天记录下Ubuntu系统下Qt开发工具使用中文输入法的流程. (题外话,Linux系统下的开发,离线是没法搞的(夸张手法),不联网简直就是事倍功 ...
- 当前linux环境做出镜像,把当前ubuntu系统做成镜像
Systemback是一个很好的备份还原软件.用它还可以生成自己的linux系统镜像文件,所以我们这里使用Systemback来制作UBuntu的镜像文件. 1 安装Systemback 在开始之前我 ...
- linux如何启动网络配置文件,linux系统的网络配置教程 Ubuntu系统网络设置方法网络配置linux及Ubuntu通过修改配置文件进行网络配置...
Windows系统网络配置方法 一.设置网络 1)Windows打开cmdcmd 输入ipconfig /all 可以看到 修改为静态IP Ubuntu修改网络为静态IP 设置虚拟机: 查看IPif ...
- linux mint卸载桌面环境,在Ubuntu系统中安装最新Cinnamon桌面环境,包括启用及卸载...
Cinnamon 桌面环境通常默认装载在 Linux Mint 版本中,它是一个传统而优雅的桌面环境,本文将为你介绍在 Ubuntu 下安装最新 Cinnamon 桌面环境的方法,包括启用及卸载方法, ...
- 【Linux 虚拟机】VMware虚拟机安装Ubuntu系统英文改中文的方法
繁體 VMware虚拟机安装Ubuntu系统英文改中文的方法 我们已经在Windows 7下用VMware Workstation 10虚拟机安装 Ubunbu 14.04. (本文更新http:// ...
- linux清理页面缓存文件夹,清理Ubuntu系统的缓存、垃圾、多余内核。
linux和windows系统不同,linux不会产生无用垃圾文件,但是在升级缓存中,linux不会自动删除这些文件,还是很占硬盘的! 一.删除缓存 1,非常有用的清理命令:sudo apt-get ...
最新文章
- mem 族函数的实现
- 关于MYSQL日期 字符串 时间戳互转
- php查询socket数据包头,php 查询数组值php中关于socket的系列函数总结
- python大杀器之requests安装
- FlexPaper 2.2.1介绍与提取嵌入的文档
- shell脚本单词去重多个文件
- 鸿蒙系统 安卓游戏,华为鸿蒙系统运行安卓游戏出现新状况!安卓换皮论被彻底打脸?...
- javascript 的位操作符转换推断
- Tensorflow2.0实战之GAN
- 计算不确定度的小工具
- 计算机桌面成英文怎样变成中文版,电脑系统菜单全变成英文怎么办
- 我为什么选择了自然码?
- 梦幻西游进入游戏显示服务器程序停止工作,win7系统提示“梦幻西游已停止工作”的解决方法...
- 国庆高质量出行,可视化开启智慧旅游
- UID/DID/SID总结
- ESP32学习【2】——ESP32固件烧录及相关问题解决
- Mathematica描绘滚球某个点的运动轨迹(摆线)
- linux mtd设备使用
- 深入理解浏览器兼容性模式
- STM32_RS485通信异常
热门文章
- LeetCode677. 键值映射(Trie树)
- html使用js的变量_2、温故而知新,再学一遍JavaScript-html中如何使用JS
- springboot listener_Springboot 监听redis key的过期事件
- php转调页面,PHP中HTTP防盗链技术
- Jquery练习题—实现分组添加功能
- linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上
- 李宏毅机器学习(九)Multi-lingual BERT
- 卖萌屋学术站发布!通往高效刷论文之路
- 模型训练太慢?显存不够用?这个算法让你的GPU老树开新花
- APPKIT打造稳定、灵活、高效的运营配置平台