cl-graphicsmagick
cl-graphicsmagick is a Common Lisp CFFI wrapper for GraphicsMagickWand.
Compatibility
Common Lisp | Linux | Mac | Unix | Windows |
---|---|---|---|---|
SBCL | Yes | Yes | ? | ? |
Note: I don't have Unix system so haven't test on Unix yet. Welcome to reply.
Build & Install GraphicsMagickWand dynamic library
Linux
Note: if you want to run cl-graphicsmagick
on Linux 64bit systems with SBCL, you should patch the source code of GraphicsMagick: delete/comment #if defined(SIGSEGV)
statement in file magick/magick.c
and build, more details see Known Issues above.
Build Dependencies
- freetype-devel
- zlib-devel
- libjpeg-devel
- libpng-devel
- libtiff-devel
- giflib-devel
- libtool-ltdl-devel
- lcms2-devel
- jasper-devel
- libxml2-devel
- bzip2-devel
Note: On CentOS you can just run command below command to install dependencies:
yum install -y freetype-devel zlib-devel libjpeg-devel libpng-devel libtiff-devel giflib-devel libtool-ltdl-devel lcms2-devel jasper-devel libxml2-devel bzip2-devel
Build from source code
mkdir /usr/local/src
cd /usr/local/src
wget http://downloads.sourceforge.net/project/graphicsmagick/graphicsmagick/1.3.25/GraphicsMagick-1.3.25.tar.gz
tar xvf GraphicsMagick-1.3.25.tar.gz
cd GraphicsMagick-1.3.25
Note: make sure comment #if defined(SIGSEGV)
statement in file magick/magick.c
./configure --enable-shared \
--disable-static \
--with-modules \
--without-x \
--without-magick-plus-plus \
--without-perl \
--disable-openmp && \
make && make install
sudo make && make install
Note: if you want to use Windows font, use option --with-windows-font-dir
, for example: --with-windows-font-dir=/usr/share/fonts/ms_font
(put Windows font files to path /usr/share/fonts/ms_font
), Windows font's filenames end with .ttf
, recommend using font file Arial Unicode.ttf
Note: Make sure file libGraphicsMagickWand.so
and libGraphicsMagick.so
can be found in one of these location: /usr/lib
/usr/local/lib
Mac OS X
Please do use HomeBrew to install GraphicsMagick:
brew install graphicsmagick
Install and load cl-graphicsmagick with QuickLisp
In shell:
git clone https://github.com/muyinliu/cl-graphicsmagick.git
cp -r cl-diskspace ~/quicklisp/local-projects/
In Common Lisp:
(ql:quickload 'cl-graphicsmagick)
Note: gm
is the nickname of package cl-graphicsmagick
Usage
Get GraphicsMagick's version
(gm:magick-get-version)
=>
"GraphicsMagick 1.3.25 2016-09-05 Q8 http://www.GraphicsMagick.org/"
1578241
Get Image's information
(gm:describe-image "/path/to/image.png")
=>
"Image: /path/to/image.png
Format: PNG (Portable Network Graphics)
Geometry: 99x99
Class: DirectClass
Type: true color with transparency
Depth: 8 bits-per-pixel component
Channel Depths:
Red: 8 bits
Green: 8 bits
Blue: 8 bits
Opacity: 1 bits
Channel Statistics:
Red:
Minimum: 0.00 (0.0000)
Maximum: 255.00 (1.0000)
Mean: 216.70 (0.8498)
Standard Deviation: 54.02 (0.2118)
Green:
Minimum: 0.00 (0.0000)
Maximum: 255.00 (1.0000)
Mean: 169.32 (0.6640)
Standard Deviation: 62.09 (0.2435)
Blue:
Minimum: 0.00 (0.0000)
Maximum: 255.00 (1.0000)
Mean: 136.35 (0.5347)
Standard Deviation: 75.14 (0.2947)
Opacity:
Minimum: 0.00 (0.0000)
Maximum: 255.00 (1.0000)
Mean: 31.79 (0.1247)
Standard Deviation: 84.25 (0.3304)
Opacity: (255,255,255,255) #FFFFFFFF
Rendering-Intent: saturation
Gamma: 0.45455
Chromaticity:
red primary: (0.64,0.33)
green primary: (0.3,0.6)
blue primary: (0.15,0.06)
white point: (0.3127,0.329)
Resolution: 28.35x28.35 pixels/centimeter
Filesize: 16.7Ki
Interlace: No
Orientation: Unknown
Background Color: white
Border Color: #DFDFDF00
Matte Color: #BDBDBD00
Page geometry: 99x99+0+0
Compose: Over
Dispose: Undefined
Iterations: 0
Compression: Zip
Png:IHDR.color-type-orig: 6
Png:IHDR.bit-depth-orig: 8
Signature: 22840ae27432c17cf141a0abbc0c892f85b16ffadd793d5caccc57b5744f40ca
Profile-color: 3144 bytes
Tainted: False
User Time: 162.980u
Elapsed Time: 223:34
Pixels Per Second: 0
"
Get image's width and height
(gm:image-width-height "/1.png")
=>
99
99
Rotate image
(gm:rotate-image "/input.png" "/rotate_output.png" "white" 45)
=>
"/rotate_output.png"
Resize image
(gm:resize-image "/input.png" "/resize_output_30x30px.png" 30 30)
=>
"/resize_output_30x30px.png"
Add text watermark to image
(gm:add-text-watermark-to-image "/input.png"
"/add_text_watermarks_output.png"
"@muyinliu"
:color "white"
:font-path "/path/to/font.otf"
:font-size 14
:gravity :%SouthEaseGravity
:x 10
:y 10)
=>
"/add_text_watermarks_output.png"
Run test case
Dependencies
Install dependencies with Quicklisp:
(ql:quickload '(prove prove-asdf cl-ansi-text))
Note: make sure have all dependencies installed.
Run test case now
In Common Lisp REPL:
(asdf:test-system :cl-graphicsmagick)
OR in Shell:
sbcl --eval "(asdf:test-system :cl-graphicsmagick)" --eval "(quit)"
Known Issues
SIGSEGV
Signal Handlers bug while runing on SBCL with Linux 64bit systems
Both GraphicsMagick and SBCL want to handle the signal cause SBCL crash on Linux 64bit systems(as far as I know, cl-graphicsmagick
crash on CentOS 5.8 Final 64bit and CentOS 6.7 Final 64bit, and stuck CPU 100% on Debian 64bit system).
CORRUPTION WARNING in SBCL pid 74031(tid 2952937472):
Signal 4 received (PC: 0x7fff78cf1614)
The integrity of this image is possibly compromised.
Continuing with fingers crossed.
Magick: abort due to signal 11 (SIGSEGV) "Segmentation Fault"...
fatal error encountered in SBCL pid 74031(tid 2952847360):
gc signals blocked
Error opening /dev/tty: Device not configured
Welcome to LDB, a low-level debugger for the Lisp runtime environment.
ldb>
solution
Thanks to mordocai, stassats and foom, solution is found.
Please delete/comment these lines(near line 1060) in magick/magick.c
of GraphicsMagick v1.3.18+:
#if defined(SIGSEGV)
(void) MagickCondSignal(SIGSEGV,MagickPanicSignalHandler);
#endif
And rebuild GraphicsMagick.
Unable to read font (/usr/local/share/ghostscript/fonts/n019003l.pfb)
Install ghostscript will solve this problem.
On Mac OS
brew install ghostscript
On Linux
yum install ghostscript
OR
apt-get install ghostscript
License
MIT (See LICENSE file for details).