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的文件,只是后缀不一样罢了:

3d28b8e4f20fb003e2bc4efd3b174359.png

这些其实只是给不同的系统环境下用的而已,继续在文件夹中找可以看到一个叫做“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个文件:

869677ce40bbe3309bbe9b86a9113aa2.png

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库相关教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

t分布f分布与样本均值抽样分布_分布模拟1——MCMC抽样方法

分布是一系列数字的规律组合。如果在收集了历史中的几百个数据后,我想知道这群数据背后的发射机制是什么,那么就得去寻找这个分布。当然这里的重点不是寻找分布,而是在已知分布的情况下,如何模拟这个机制发射出来的一系列数字呢&a…

UWP Composition API - PullToRefresh

UWP Composition API - PullToRefresh 原文:UWP Composition API - PullToRefresh背景: 之前用ScrollViewer 来做过 PullToRefresh的控件,在项目一些特殊的条件下总有一些问题,比如ScrollViewer不会及时到达指定位置。于是便有了使用Composit…

linux 普通io实现pwm,用普通IO口做PWM输出 - 51单片机 - 电子工程世界-论坛 - 手机版...

本人现在想用IO口做PWM输出,频率1KHz,然后用两按键(、-)来调节占空比0-100%,对应数码管显示000-100。现波形是OK了,也可以调占空比,但是出现一个问题数码管显示乱七八糟,调了两天都没有调好,还请…

从城市治理到城市“智”理,AI 不仅是城市管理的“眼睛”

来源:帮尼资讯部分参考来源:中国安防行业网,图片来源网络近年来,随着计算机视觉技术的长足进步,AI在城市管理领域广泛部署。其中,AI视频分析识别技术成为城市场景中规模最大、数量最多、落地最广泛的应用。…

python3 应用 nose_parameterized 实现unittest 参数化

一、读取变量的值,实现unittest 参数化 import nose_parameterized,unittestdef calc(a:int,b:int):return ab case_data [[10,20,30],[12,21,33],[15,21,36] ] class MyClass(unittest.TestCase):nose_parameterized.parameterized.expand(case_data)def test_comp…

vue data数据修改_VUE的数据响应式

什么是数据响应式?const vm newVUE({data:{n:0}})上面的代码中,如果修改vm.n,那么UI中的n就会通过变化来响应我,这就是数据响应式。VUE对data做了什么?当给一个vue实例传入data的时候,vue内部会对传入的dat…

linux使用vim开启文档,linux 配置 直接用VIM默认打开文件

方法一:主要 是把gedit 默认打开的文件 都改成 vim了 此方法有缺陷。推荐使用 方法二 可以指定 哪种类型文件 用VIM 默认打开。两种方法都实现了 方便打开文件 摆脱了用VIM编码 打开文件还要 输入 烦长的路径,配置如下:方法一:把所有 默认 用 gedit 打开…

C#多线程技术总结(异步)

我这里针对现有的C#多线程技术进行一个汇总,一是复习,二是方便索引,文章部份知识点来源于网络,非本人原创。 一、并行(异步): 1.System.Threading.Tasks命名空间下的(TPL): 1.1&…

hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...

当年我还是个学生的时候,有一次去参加欢聚时代的一个面试,有一道面试题记忆尤新,让你来实现一个定时任务,你会怎么做?为了简化问题,我们只用考虑内存方案,不用考虑数据持久化。数组法最简单的&a…

蜂鸟开发板 linux,蜂鸟E203系列——Linux下运行hello world例程

创建程序在 ~/hbird-e-sdk-master/software 路径下创建一个“helloworld”中文件夹在 ~/hbird-e-sdk-master/software/helloworld 路径下创建文件“helloworld.c”内容如下:#includeint main(void){printf("hello world!");printf(…

全景解密量子信息技术:高层集中学习,国家战略,三大领域一文看懂

来源:智东西 内参来源:中国信通院 IPRdaily中文网10月16日下午,高层就量子科技研究相关前景举行了一次会议,强调当今世界正经历百年未有之大变局,科技创新是其中一个关键变量。要充分认识推动量子科技发展的重要性&am…

shell 脚本编写 if else then

shell 脚本编写 if else then if ....; then .... elif ....; then .... else .... fi 大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…   通常用" [ ] "来表示条件测试。注意这里的空格很重要。…

mac怎么查看gitlab的注册邮箱_163电子邮箱怎么注册申请?手机号注册电子邮箱的小技巧...

电子邮箱帮助我们实现了无纸化,无需手写信件,通过电脑、手机输入,即可与收件人在网络上进行联系。电子邮箱的兴起,对于人与人之间的沟通和交流,增加了便捷性,促进了社会的发展与进步。目前的邮箱中&#xf…

c语言 switch案例,c语言switch case语句使用例子

c语言switch case语句使用例子发布时间:2020-04-23 11:48:53来源:亿速云阅读:421作者:小新这篇文章主要为大家详细介绍了c语言switch case语句使用例子,文中示例代码介绍的非常详细,具有一定的参考价值&…

把手机上的新浪微博客户端卸载了

因为我本身发微博的时候就是通过通过电脑上的浏览器发的,就连看别人发的微博也是通过浏览器发的,基本上也不怎么用手机客户端。反而是客户端总是推送各种新闻,我实在是没有这个需要,也完全不想被弹窗影响。 综上所述,因…

深度学习未来的三种方式

来源:海豚数据科学实验室深度学习的未来在于这三种学习模式,而且它们彼此之间密切相关:混合学习——现代深度学习方法如何跨越监督学习和非监督学习之间的边界,以适应大量未使用的无标签数据?复合学习——如何以创造性…

c 语言sort函数,C/c++语言sort函数如何使用

头文件是#include比如说数组a[5]{1,5,4,2,3};当你用sort(a,a5)时&#xff0c;就把数组a从小到大排序了for(i0;i<5;i){printf("%d \n",a[i]);}输出为1 2 3 4 5C语言中没有预置的sort函数。如果在C语言中&#xff0c;遇到有调用sort函数&#xff0c;就是自定义的一个…

android ocr识别源码_身份证识别OCR解决手动输入繁琐问题

随着互联网金融的的发展&#xff0c;越来越多的互联网金融公司都推出了自己的金融APP&#xff0c;这些APP都涉及到个人身份证信息的输入认证&#xff0c;如果手动去输入身份证号码和姓名&#xff0c;速度非常慢&#xff0c;且用户体验非常差。为了提高在手机移动终端上输入身份…

mybatis异常invalid comparison: java.util.Date and java.lang.String

原文链接&#xff1a;http://blog.csdn.net/wanghailong_qd/article/details/50673144 mybatis异常invalid comparison: java.util.Date and java.lang.String 开发中改动mapper文件后需要重新编译发布, 由于工程比较大非常耗时, 所以为方便快速测试干脆写了一个小java工程. 工…

计算机c语言等级考试PDF,国家计算机等级考试c语言精华.pdf

心之所向&#xff0c;所向披靡C 语言总复习顺序结构程序设计1.单字符输入输出&#xff1a;getchar(字符变量) &#xff1b;putchar(字符变量) &#xff1b;2.字符串输入输出&#xff1a;gets(字符数组名),puts(字符数组名)。3.格式化输入输出&#xff1a;(1)格式化输入&#xf…