How does Common Lisp use ImageMagick?

有时候要对用户上传的图片进行简单的修改,例如提供缩尺寸较小的略图版本
以前在nodejs是用 imageMagick来对用户上传的头像剪裁正方形对应尺寸,但是其他大多数图片都是用七牛对应的queryString来指向对应尺寸的图片,还有获取平均rgb值

现在我开始不用七牛,在本地存储和处理图片了,上个月我为了计算rgb值,开始用以前 opticl [GitHub - slyrus/opticl: An image processing library for Common Lisp] ,但是后面发现好多文件(也是JPG)都说不支持,然后改用了 CL-GD [CL-GD - Use the GD Graphics library from Common Lisp ] 安装起来有点点麻烦,可以读取每个图片文件。但是今天发现生成新图片文件效果很不理想,例如照着示例代码用 copy-image 都不能正常地复制图片文件,大都是新图片颜色有点差别,甚至用 get-pixel/set-pixel 都不能跟料想的那样运行。。。

所以我只想到用 ImageMagick ,但是是通过 run-program这样像shell的多进程来运行 convert (功能是超多),是不是成本很高?每次都是重新加载新程序(就像开车时频繁熄火和启动吧)啊。。

想请教是不是有更好的方法?例如 cffi 来加载对应的C代码库?或者是用C来建个进程监听请求(Socket)来运行 convert 的代码库函数,同一个进程不用每次重启,大大加快速度?

可能这是个有点初级的问题,请忍受。。。

https://imagemagick.org/script/api.php


如果觉得 opticl 不好的话可以去提 feature request 说明一下哪里不能滿足需求。

楼主的意思是用户图片上传完成之后对图片进行尺寸修改然后在返回给用户缩略图?每次上传图片后处理都要启动一个shell的多进程来运行convert,这样确实不太好。楼主都说了解决办法:启动一个shell进程不退出监听用户上传图片的操作运行convert,这样能大大加快速度应该是没问题的。

但如果用户很多天都没有图片上传的情况,shell进程也一直要在后台开着一直不断监听请求,这样资源占用不是更多。

就是说用C这个listening的 socket 监听并处理然后返回数据? 前提是也要配合imageMagick的源码吗??仅有该程序能不能“融入”其中,可能/应该也是有个对应的 *.lib *.a 库文件,编译时link一下哦?
(C用得少啊,不过觉得这样也挺好玩的……)

这种监听方式是不是大家常用的普遍配合方式? 还是说导出二进制代码库更多?
除了复杂的要多进程共享数据的如数据库之类的,就通过保持连接的socket来配合
同学们工作中普遍这样做吗?所以对于大公司一个团队就负责一个库?

那个自称快得多的是关键就是通过CFFI加载libev吧?晚点我会去看他代码的。。

最近好像自己眼界越来越广了,觉得自己越来越低(年)级了……

听起来貌似该库没什么问题的,是我没搞清楚怎么用?
我试了下想要处理一些照片是有的行有的不行


之前尝试了很多功能例如滤镜:

觉得好像发现惊喜很有用,不过当时我基本就是用那一两张图片,没发现问题,后面发现其它图片很多都不行了

另外请教个算法问题 @LdBeth 就是图片的滤镜主要是些数学运算吧,我半年前的时候用JS的 2d canvas 尝试了觉得好像也挺简单(不过对hsl一直还没去了解) ,原来CSS的filter不过如此。。。

但是对模糊滤镜实现觉得计算时间很多(还有图片放大),我也想过优化
例如计算出左边像素的周围平均值后,右边像素就通过左边的减去最左边那一列再加上右边一列的像素,算是个简单的”缓存“机制,是快了一些,但是还是和CSS滤镜的blur 的效率时间大相径庭,我猜测是不是浏览器利用了显卡来计算,所以高效流畅得多了?请教下圆梨~~
栗子: http://filter.celwk.com (Safari不能正常打开,Chrome和FireFox都没问题)

没人去写。

你知不知道有个叫 SIMD

不知道,刚查了下,好像就是我刚才说的GPU吧:

不过有点囧的是,我试过探索WebGL,但是每次运行好像电脑就有点开始发热在响,即使是简单的计算,可能是因为我是长期在动画吧,这样说来Chrome也是占用了不少GPU的?(十几年前要玩魔兽都要独显,但是没有独显Chrome好像也不会觉得网页卡,可能是那时CSS3/Canvas 都还没有,要求没那么高?

也就是说如果我要实现的高级点的滤镜用WebGL来做会快得多咯~

SIMD 是 CPU 指令集,射射。你查得什么玩意,怎么连百度都不如

呃,没有很仔细地读,看到那里几个关键字以为是指GPU的,看来他强调的就是利用多CPU咯?

因为像我这个电脑CPU也只有4个吧,但是感觉那个模糊的计算时间比我快得远超过4倍啊,所以我想要用到GPU吧?

可能是因为前段时间在探索学习WebGL好像觉得在图片像素处理领域上CPU和GPU差得远了,忽略了~~

话说 MapReduce 也就是充分利用并行 CPU 计算吧

SIMD 和 CPU 核数量没关系。单核一样支持 MMX。最早支持 MMX 的是 Pentium。

:cold_face: 我在硬件上还是比较接近文盲(虽然也是有兴趣,但是对软件代码更有兴趣又学不完啊。。)
多谢指教扩展视野 :handshake:

顺便请问一下,这个SIMD 没能被 JS Canvas 2D 利用到吗?
有没有JS代码能做到浏览器的过渡动画效果那么平滑?(不用CSS)

/*
估计核心关键点就是充分利用好多核CPU?(JS里就用 Worker 了)

WebGL 可以 2D 不能利用GPU帮忙并行计算? 但是显示器会很大声? 怪不得Chrome大多时候不会让显示屏叫,原来是充分利用多CPU啊
*/

不懂 JavaScript

JavaScript 算是 Lisp (Schema) 的一个怪胎吧……:space_invader:

那我也不懂 python

这个我也不懂,买了两本Python书放了两年了还没看
之前就因为广为流传网络爬虫Python招牌吧?是因为语言还是因为代码库丰富啊?
Python 的一大尴点是性能低吧(记得知乎招聘的开发者是用Python)? 那用CL 做爬虫不会输给Pythin吧?
我有兴趣做一个,利用那个 Dexador:


性能会远远超过Python吗?

请教班长,你工作是用Common Lisp吗? 正规发布的项目是用什么“管理”工具?
我现在都是用 screen 在远程服务器运作SLIME(不过在screen下我的Emacs的主题色调变化很大),这个会不会有问题?例如性能代价大吗?

还是主流用roswell ?

我没有写代码的工作。现在的兴趣之一是修复和整理 60-80 年代的 AI 相关的软件,之二是算法作曲。除此之外不写代码,因为太麻烦。

然而你完全可以从本地的 Emacs 接上服务器上的 lisp,为了安全 ssh tunnel 上去转幾端口到本地就行。

Connecting to a remote lisp (SLIME User Manual, version 2.24)

爬虫这种主要花在 IO 上的,想靠換编程语言优化不如多搞几台服务器整个分布式实在。用 CL 写主要就是为了解決有无的问题,除非现成的那几个 CL 爬虫库。

2 个赞