湖濱散記部落格的樹心幽徑[login][主頁]
483:20190217在fedora28裝ImagicMagicK並設計chopcrop.c來裁切影像、lrcat.c來接合左右二張影像、udcat.c來接合上下二張影像。

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)過程截圖:

alt

 


select id,article_id,topic,text from lt_articles_text where article_id =483; ok. update lt_articles set num_reads=num_reads +1 where id=483; ok.