REF:http://lfwiki.kmvs.km.edu.tw/lf/index.php?op=ViewArticle&articleId=357&blogId=70
下載頁面: https://www.imagemagick.org/script/install-source.php
(0)$ identify -version Version: ImageMagick 6.9.9-38 Q16 x86_64 2018-03-12 http://www.imagemagick.org Copyright: © 1999-2018 ImageMagick Studio LLC License: http://www.imagemagick.org/script/license.php Features: Cipher DPC Modules OpenMP Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib jbig jng jp2 jpeg lcms ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib
(1)下載原始碼檔:$ wget https://imagemagick.org/download/ImageMagick.tar.gz
(2)解壓、組態並編譯:
$ tar xvzf ImageMagick.tar.gz
$ cd ImageMagick-7.0.8-27/
$ ./configure
$ make
(3)安裝並測試使用
(3-1)安裝$ sudo make install
(3-2)連結程式庫:$ sudo ldconfig /usr/local/lib
(3-3)測試有無功能:$ /usr/local/bin/convert logo: logo.gif
$ ls logo.gif -l -rw-rw-r-- 1 treehrt treehrt 28576 2月 17 21:38 logo.gif
(3-4)$ make check
============================================================================ Testsuite summary for ImageMagick 7.0.8 ============================================================================ # TOTAL: 86 # PASS: 84 # SKIP: 0 # XFAIL: 0 # FAIL: 2 # XPASS: 0 # ERROR: 0 ============================================================================ See ./test-suite.log Please report to https://github.com/ImageMagick/ImageMagick/issues :
(4-1)編寫chopcrop.c如下,用以將給定的圖檔依給定的左上角座標(ox,oy)及寬高(w,h)進行裁切:
#include <stdio.h> #include <math.h> #include <Magick++.h> using namespace Magick; int main(int argc, char *argv[]){ if (argc!=6) { printf("語法 ./chopcrop 1.png 22 77 1897 1002\n"); printf("輸出檔為chopcrop.jpg\n"); exit(-1); } Image ima; ima=Image(argv[1]); int ox=atoi(argv[2]); int oy=atoi(argv[3]); int w=atoi(argv[4]); int h=atoi(argv[5]);
Geometry size = ima.size(); int iw=size.width(); int ih=size.height(); printf("original image size: iw=%d,ih=%d\n",iw,ih); ima.chop(Geometry(ox,oy)); size = ima.size(); iw=size.width(); ih=size.height(); printf("After chop(%d,%d) step 1: new image size: iw=%d,ih=%d\n",ox,oy,iw,ih);
ima.crop(Geometry(w,h)); size = ima.size(); iw=size.width(); ih=size.height(); printf("After crop(%d,%d) step 2: new image size: iw=%d,ih=%d\n",w,h,iw,ih); ima.write("chopcrop.jpg"); printf("輸出圖檔 chopcrop.jpg 成功!\n"); }
(4-2)編譯chopcrop.c
$ g++ `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7 chopcrop.c `Magick++-config --ldflags --libs` -L/usr/local/zlib/lib -lz -Wall -export-dynamic -lm -o chopcrop
(4-3)執行chopcrop以裁剪6張1920*1080的png圖檔
:
如下指令將J02_247000x2594700m300.png圖檔依給定的左上角座標(22,43)及寬、高(1876,997)進行裁切,並將結果改名為J2.jpg
$ ./chopcrop J02_247000x2594700m300.png 22 43 1876 997
original image size: iw=1920,ih=1080 After chop(22,43) step 1: new image size: iw=1898,ih=1037 After crop(1876,997) step 2: new image size: iw=1876,ih=997 輸出圖檔 chopcrop.jpg 成功!
$ mv chopcrop.jpg J2.jpg
:
(5-1)編寫lrcat.c如下:
#include <stdio.h> #include <math.h> #include <Magick++.h> using namespace Magick; int main(int argc, char *argv[]){ if (argc!=4) { printf("語法 ./lrcat 1.jpg 2.jpg 0\n"); printf("輸出檔為lrcat.jpg\n"); exit(-1); } Image ima,imb; ima=Image(argv[1]); imb=Image(argv[2]); int overlap=atoi(argv[3]);
Geometry size = ima.size(); int wa=size.width(); int ha=size.height(); size = imb.size(); int wb=size.width(); int hb=size.height(); int h=(ha>hb)?ha:hb; Image im(Magick::Geometry(wa+wb-overlap,h),"white"); im.composite(ima, 0, 0, OverCompositeOp); im.composite(imb, wa-overlap, 0, OverCompositeOp); im.write("lrcat.jpg"); printf("輸出圖檔 lrcat.jpg 成功!\n"); }
(5-2)編譯lrcat.c
g++ `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7 lrcat.c `Magick++-config --ldflags --libs` -L/usr/local/zlib/lib -lz -Wall -export-dynamic -lm -o lrcat
(5-3)執行lrcat 將左右二圖接合(重疊92像素)
$ ./lrcat J6.jpg J1.jpg 92 輸出圖檔 lrcat.jpg 成功!
$ mv lrcat.jpg J6J1.jpg
$ ./lrcat J5.jpg J2.jpg 92 輸出圖檔 lrcat.jpg 成功!
$ mv lrcat.jpg J5J2.jpg
$ ./lrcat J4.jpg J3.jpg 92 輸出圖檔 lrcat.jpg 成功!
$ mv lrcat.jpg J4J3.jpg
(6-1)編寫udcat.c如下:
#include <stdio.h> #include <math.h> #include <Magick++.h> using namespace Magick; int main(int argc, char *argv[]){ if (argc!=4) { printf("語法 ./udcat 1.jpg 2.jpg 0\n"); printf("輸出檔為udcat.jpg\n"); exit(-1); } Image ima,imb; ima=Image(argv[1]); imb=Image(argv[2]); int overlap=atoi(argv[3]);
Geometry size = ima.size(); int wa=size.width(); int ha=size.height(); size = imb.size(); int wb=size.width(); int hb=size.height(); int w=(wa>wb)?wa:wb; Image im(Magick::Geometry(w,ha+hb-overlap),"white"); im.composite(ima, 0, 0, OverCompositeOp); im.composite(imb, 0, ha-overlap, OverCompositeOp); im.write("udcat.jpg"); printf("輸出圖檔 udcat.jpg 成功!\n"); }
(6-2)編譯udcat.c
$ g++ `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7 udcat.c `Magick++-config --ldflags --libs` -L/usr/local/zlib/lib -lz -Wall -export-dynamic -lm -o udcat
(6-3)執行udcat 將上下二圖接合(重疊57像素)
$ ./udcat J6J1.jpg J5J2.jpg 57 輸出圖檔 udcat.jpg 成功!
$ mv udcat.jpg J6J1-J5J2.jpg
$ ./udcat J6J1-J5J2.jpg J4J3.jpg 57 輸出圖檔 udcat.jpg 成功!
$ mv udcat.jpg J6J1-J5J2-J4J3.jpg
(6-4)將J6J1-J5J2-J4J3.jpg(3660x2877)裁切為左、右二半各一張圖(1830x2400),由上而下超過2400的部份也裁去。
$ ./chopcrop J6J1-J5J2-J4J3.jpg 1830 0 1830 2400 original image size: iw=3660,ih=2877 After chop(1830,0) step 1: new image size: iw=1830,ih=2877 After crop(1830,2400) step 2: new image size: iw=1830,ih=2400 輸出圖檔 chopcrop.jpg 成功!
$ mv chopcrop.jpg jadeE.jpg
$ ./chopcrop J6J1-J5J2-J4J3.jpg 0 0 1830 2400 original image size: iw=3660,ih=2877 After chop(0,0) step 1: new image size: iw=3660,ih=2877 After crop(1830,2400) step 2: new image size: iw=1830,ih=2400 輸出圖檔 chopcrop.jpg 成功!
$ mv chopcrop.jpg jadeW.jpg
(7-1)結果檔: http://insecta.idv.tw/mtwalker/J6J1-J5J2-J4J3.jpg
(7-2)結果檔:http://insecta.idv.tw/mtwalker/jadeE.jpg
(7-3)結果檔:http://insecta.idv.tw/mtwalker/jadeW.jpg
(7-4)過程截圖:

|