Help us understand the problem. What is going on with this article?

Windows64bit版JMagickの作成

More than 3 years have passed since last update.

JMagickのWindows64bit版が無くて皆さん苦労しているみたいなのでちょいと作ってみることに。
ちなみにImageMagickのVer7に対応するJMagickのソースは無いようです。


** 注意 **
 ImageMagickの6.9.8の場合、JMagickは6.6.9を使う必要があります。
 JMagick7だとJNIの関数が大きく変わっているので、かなり不安定な動きをします。


作業一覧

  1. Visual Studioのインストール
  2. ImageMagickのインストール
  3. JavaのJNI関係のインストール
  4. JMagickの作成
  5. EclipseでJMagickの動作確認

用意するもの

Visual Studio
Eclipse
pleiades all in one 使用したのは”pleiades-e4.4-ultimate-jre_20130625”
ImageMagickソース
ImageMagickのサイトからダウンロードしたImageMagick-6.9.8-0.zip
JMagickソース
githubからチェックアウトしてくる

Visual Studio2017のインストール

ImageMagick,JMagickのコンパイルのために使います。
 https://www.microsoft.com/ja-jp/dev/campaign/free-edition.aspx

  1. Visual Studio Communityのダウンロード
    https://www.visualstudio.com/ja/vs/community から「VS Community 2017 ダウンロード」をクリックし、「vs_Community.exe」をダウンロードする

  2. Visual Studio Community 2017のインストール

 「vs_Community.exe」を実行し、Visual Studio Community 2017の「インストール」をクリック

ImageMagickのインストール

 ImageMagickのinclude,libを使うので、ImageMagickのダウンロードサイトからWindows用のZIP圧縮されたソース群をダウンロードし、解凍する
  ※ImageMagick7だとincludeのパスが違うので、ImageMagick6をソースからダウンロードし、VisualStudioを使ってコンパイルする

 1. ImageMagickのダウンロードと解凍
  ダウンロードファイル:ImageMagick-6.9.8-0.zip
 
 2. configure.exeの作成
  ダウンロードしたZIPを解凍すると
  \ImageMagick-6.9.8-0\VisualMagick\configure\configure.sln
 というソリューションがあるので、このソリューションをVisualStudioで開き、ビルドする
  ※このときプロジェクトの構成は何も変更しなくて良いです

  \ImageMagick-6.9.8-0\VisualMagick\configure\configure.exeが作られる

 3. configure.exeを実行し、VisualStudio用のソリューションを作成する
  2.で作成したconfiure.exeを起動して下記のとおり実行

configure_exe_1.png

configure_exe_2.png

configure_exe_3.png

configure_exe_4.png

 \ImageMagick-6.9.8-0\ImageMagick-6.9.8-0\VisualMagick\VisualDynamicMT.sln
が作成されます

 4. VisualDynamicMT.slnをビルドする

   VisualStudioでVisualDynamicMT.slnを開くと再ターゲットが実行されたり、必要なライブラリをインストールしろとか言われるので、言われた通りにする必要がある
 
なおmagick-baseconfig.hの下記をコメントにしないと、推奨されない関数群がコンパイルされないので、JMagickのコンパイル時にリンクエラーとなる

  ```magick-baseconfig.h
  //#define MAGICKCORE_EXCLUDE_DEPRECATED ```
  1. 作成されたbinとlibをC:\ImageMagcikにコピーする
      下記に作成されたbin,libをC:\Imagemagickにコピーする。
      \ImageMagick-6.9.8-0\ImageMagick-6.9.8-0\VisualMagick
    ※かならずしもC:\直下じゃなくて良いです。ただPATHを通したりするのでわかりやすい場所が望ましい

  2. 環境変数の設定
       「コントロールパネル」「システム」「システムの詳細設定」「環境変数」から
      システム環境変数のPATHをダブルクリックして開き、「C:\ImageMagick\bin」を追加。

JavaのJNI関係のインストール

 pleiades の java には include が無いので jdkをインストールする
 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
 ダウンロードした jdk-7u51-windows-x64.exe ファイルを実行する
 インストールフォルダ\Java\jdk1.7.0_45\include     ←ここにJNIのインクルードが入っている

JMagickの作成

 1. EclipseでGitHUBからJMagick の取得
  「ウィンドウ」→「パースペクティブを開く」→「その他」→「Git」
  「Gitリポジトリを複製し、このビューへ追加」→「URIの複製」
   <ロケーション>
     URI:https://github.com/techblue/jmagick
    <ブランチ選択>
     6.6.9、masterを選択
    <ローカル宛先>
     Gitインストールフォルダ\git\jmagick
    

 2. プロジェクトの作成

   ナビゲータから「インポート」→「Git」→「Gitからプロジェクト」でJMagickプロジェクトを作成する
    <Gitリポジトリーの選択>で1. で作成したリポジトリを選択
    <Gitからプロジェクトをインポート>でImport using the New Project wizardを選択し、次へ
    <新規プロジェクト>でJavaプロジェクトを選択し、次へ
    <Javaプロジェクトの作成>でプロジェクト名にJMagickを入力

 3. Makefile の編集
   ①\JMagickプロジェクトフォルダ\win32\Makefile.all
   \JMagickプロジェクトフォルダ\src にコピーし、
  コピーしたMakefile.all を下記のように編集する。 

  ``` Makefile.all
  # include および 64bit Lib 指定  
  CPPINC=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include
  CPPLIB=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\lib\x64

  # JDK ディレクトリ指定 
  JDKDIR=JDKインストールフォルダ\Java\jdk1.7.0_45
  # ImageMagick ディレクトリ指定 
  MAGICKDIR=C:\ImageMagick
  # コンパイラフラグ 
  CPP_FLAGS= \
 /nologo /MT /w /EHsc /Od /Gs0 /Fo"$(INTDIR)\\" /c /favor:AMD64 \
        /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" \
        /D "JMAGICK_EXPORTS"  /D "_VISUALC_" /I "$(CPPINC)" \
        /I "$(JNIINC)" /I "$(JNIINC)/win32" /I "$(MAGICKINC)" \
        /I "$(GENDIR)" /I "$(SRCDIR)" /I "$(MAGICKINCDIR)"
  #リンクフラグ 
  LINK32_FLAGS= \
        "$(MAGICKLIB)" \
        /nologo /dll /incremental:no /machine:x64 \
        /libpath:"$(CPPLIB)" \
        /out:"$(OUTDIR)\jmagick.dll" \
        /implib:"$(OUTDIR)\jmagick.lib" \
        /NODEFAULTLIB:msvcrt.lib \
        /MANIFEST   
    #Java コンパイラオプション 
    CLASSES :    $(SRCDIR)\*.java $(SRCDIR)\util\*.java "$(JDKBIN)\javac" -source 1.7 -target 1.7 -d $(CLSDIR) -classpath $(SRCDIR) -sourcepath $(SRCDIR) $(?) 
    ```

  ②\ImageMagick-6.9.8-0\ImageMagick\magickフォルダを C:\ImageMagickにコピーする。
 

 4. makeを実行する

コマンドプロンプトからmakeを実行し、JNIのインクルードファイル、jmagick.jar、jmagick.dllを作成する

   cd "\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build"
vcvarsx86_amd64.bat

   cd C:\Users\tsukamoto\git\jmagick\src
   mkdir ..\classes ..\generated ..\doc ..\lib ..\
   nmake -f Makefile.all

 ★これでJNIのinclude、jmagick.jar、jmagick.dllファイルができあがるので、
  C:\ImageMagick\binにコピーする

EclipseでJMagiclkの動作確認

作成したJmagcik.jarとjmagick.dllを動作確認する

 ImageMagickTest.java
 package ImageMagickTest;


import magick.ColorspaceType;
import magick.ImageInfo;
import magick.MagickApiException;
import magick.MagickException;
import magick.MagickImage;


public class ImageMagickTest {

    public static void main(String[] args) {

        // 変換前ファイルのロード
        String LoadFileName = args[0];
        String SaveFile = args[1];

        try{
        // イメージマジックのオブジェクトを生成
        ImageInfo info = new ImageInfo(LoadFileName);
        MagickImage image = new MagickImage(info);

        System.out.println("SizeBlob="+image.sizeBlob());

        // 解像度
        System.out.println("XResolution:"+ image.getXResolution());
        System.out.println("YResolution:"+ image.getYResolution());
        // 画像フォーマット
        System.out.println("ImageFormat:"+ image.getImageFormat());


        // カラー区分設定
        System.out.println("Colors:"+ image.getColors());
        int iColorSpace=image.getColorspace();
        //System.out.println("ColorSpace:"+ iColorSpace);
        switch(iColorSpace){
        case ColorspaceType.RGBColorspace :
            System.out.println("RGBColorspace");
            break;
        case ColorspaceType.CMYKColorspace:
            System.out.println("CMYKColorspace");
            break;
        case ColorspaceType.GRAYColorspace:
            System.out.println("GRAYColorspace");
            break;
        case ColorspaceType.sRGBColorspace:
            System.out.println("sRGBColorspace");
            break;
        case ColorspaceType.UndefinedColorspace:
            System.out.println("UndefinedColorspace");
            break;
        default:
            System.out.println("その他");
            break;
        }
        if(image.isGrayImage()){
            System.out.println("isGraymage:True");
        }else{
            System.out.println("isGraymage:False");
        }

        // 後処理
        image.destroyImages();

    }catch(MagickApiException ex) {
        System.out.println( "ImageJpgChg MagickApiException 例外発生");

    }catch(MagickException Me){
        System.out.println( "ImageJpgChg MagickException 例外発生");
    }
    catch(Exception e ){
        System.out.println( "ImageJpgChg Exception 例外発生");
    }
    }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away