blog

初めての Middleman シリーズ初めてのMiddleman:Gulpを使ってサムネイル画像を生成する

    • Ryuichi Nonaka
    この記事は書かれてから1年以上経過しており、内容が古い場合があります。

    はじめに

    前回はMiddleman-Blogの記事毎に画像を管理する方法について紹介しました。今回はこの画像を自由ににリサイズできるようにしたいと思います。Middlemanの拡張機能を色々と探し試しましたが、残念ながら実用に耐えるものはありませんでした。

    使い方が悪いということもあるかもしれません。他にgemを使ってリサイズする方法も考えましたがめんどくさそうなのでシンプルさはなくなりますがGulpを使うことにしました。

    画像をリサイズし易いディレクトリ構造に変える

    前回の記事で作ったディレクトリ構造がこれです。

    .
    └── 2015
        └── 04
            └── 06
                └── middleman-management-article-images
                    ├── index.html.md
                    └── photo.jpg
    

    これを下記のように変更します。

    .
    └── 2015
        └── 04
            └── 06
                └── middleman-management-article-images
                    ├── index.html.md
                    └── images
                       └── origin
                          └── photo.jpg
    

    こうすることでoriginフォルダ内の画像を対象にディレクトリを分けて画像をリサイズできるようにします。

    Gulp環境を作る

    Gulpについては過去に記事を書いているのでこちらこれからはじめるGulp(1):bundler, rbenv, nodebrewでGulp環境を作ってみるを参照してみてください。私の環境ではnodebrewを使っています。nodebrewについてはnodebrewを使ったnode.jsのバージョン管理をどうぞ。

    npmの初期設定

    まずは$ npm initで初期設定を行います。
    次にGulpをグローバルとローカルにインストールします。

    $ npm install --global gulp
    $ npm install --save-dev gulp
    

    必要なモジュールをインストールする

    今回は3つのモジュールをインストールします。まず、記事毎の画像が入っているパスをglob-allで配列化し、gulp-image-resizeで画像をリサイズ、リサイズしたファイルをログに流すためにgulp-filelogを使います。加えてgulp-changedを使ってすでにリサイズ済みの画像があればリサイズ対象から除外するようにします。

    $ npm install --save-dev glob-all gulp-image-resize gulp-filelog gulp-changed
    

    タスクを作る

    gulpfile.jsを作って画像をリサイズするタスクを作ります。gulp-image-resizeに関する解説はこれからはじめるGulp(16):gulp-image-resizeプラグインを使ってサムネイルやレスポンシブイメージを作るを参照してください。

    var gulp        = require('gulp');
    var glob        = require('glob-all');
    var filelog     = require('gulp-filelog');
    var changed     = require('gulp-changed');
    var imageResize = require('gulp-image-resize');
    
    
    gulp.task( 'image-resize:eyecatch', function(){
      var srcGlobs   = glob.sync('source/articles/**/images/');
      var srcDir     = 'origin';
      var dstDir     = 'eyecatch';
      var targetFile = '/*.+(jpg|jpeg|png|gif)';
    
      var resizeOptions = {
        width       : 400,
        height      : 400,
        gravity     : 'Center',
        crop        : true,
        upscale     : false,
        imageMagick : true
      };
    
      var imageminOptions = {
        optimizationLevel: 7
      };
    
      for(var item in srcGlobs) {
        var srcGlob = srcGlobs[item] + srcDir + targetFile;
        var dstGlob = srcGlobs[item] + dstDir;
    
        gulp.src( srcGlob )
          .pipe(changed( dstGlob ))
          .pipe(imageResize( resizeOptions ))
          .pipe(gulp.dest( dstGlob ))
          .pipe(filelog());
      }
    });
    
    gulp.task( 'image-resize', ['image-resize:eyecatch'] );
    

    このタスクで400px * 400px の中央を基準にしたcrop画像を作ることができます。

    タスクを実行する

    タスクを実行するとリサイズされた画像のパスが表示されます。

    gulp image-resize
    [02:14:55] Using gulpfile ~/Projects/whiskers.nukos.kitchen/gulpfile.js
    [02:14:55] Starting 'image-resize:eyecatch'...
    [02:14:55] Finished 'image-resize:eyecatch' after 10 ms
    [02:14:55] Starting 'image-resize'...
    [02:14:55] Finished 'image-resize' after 5.44 μs
    [02:14:55] [1] [/Users/nukos/Projects/new.whiskers.nukos.kitchen/source/articles/2015/03/03/example-01/images/eyecatch/photo.jpg]
    [02:14:55] Found [1] files.
    

    リサイズされた画像は下記のように保存されます。

    .
    └── 2015
        └── 03
            └── 03
                └── example-01
                    ├── images
                    │   ├── eyecatch
                    │   │   └── photo.jpg
                    │   └── origin
                    │       └── photo.jpg
                    └── index.html.md
    

    これで画像の管理も大分楽になりますね。
    OGP用画像やサムネイルの作成も簡単にできるようになります。
    今回はここまで。

    シリーズ

    1. 初めてのMiddleman:rbenv, bundler 環境でMiddlemanを使ったHello World
    2. 初めてのMiddleman:レイアウト機能でレイアウトとコンテンツを分離する
    3. 初めてのMiddleman:パーシャルを使ったコンテンツのモジュール化
    4. 初めてのMiddleman:SCSSのコンパイルとテンプレートの基礎
    5. 初めてのMiddleman:Sass MixinライブラリのBourbon, Neatを導入してみる
    6. 初めてのMiddleman:データファイルとデータファイルを使った動的ページ生成
    7. 初めてのMiddleman:サイトにブログ機能を追加する
    8. 初めてのMiddleman:Amazon S3にビルドされたファイルを同期する
    9. 初めてのMiddleman:HTML/CSS/JS/画像をビルド時に圧縮する
    10. 初めてのMiddleman:設定について
    11. 初めてのMiddleman:静的サイトのキャッシュとasset_hash拡張を使ったキャッシュのパージ
    12. 初めてのMiddleman:Middleman::S3Syncで使うAWS IAMユーザーのアクセスキー管理方法について
    13. 初めてのMiddleman:Helperを使ってGravatarのアイコンを表示する
    14. 初めてのMiddleman:アセットパイプラインを使った外部アセットファイルの読み込みと結合
    15. 初めてのMiddleman:Bowerを使ってjQueryなどのライブラリをロードする
    16. 初めてのMiddleman:スケルトンを自作する方法
    17. 初めてのMiddleman:Middleman Blogの記事データを使いやすく管理する方法
    18. 初めてのMiddleman:Middleman-blogのシングルブログを前提としたSkeletonを作った
    19. 初めてのMiddleman:Middleman-blogでマルチブログを試してSkeletonを作った
    20. 初めてのMiddleman:Markdown EngineをkramdownからRedcarpetに切り替える
    21. 初めてのMiddleman:RedcarpetとMiddleman::Rougeを使ったシンタックスハイライト
    22. 初めてのMiddleman:Middleman-Syntaxを使ったシンタックスハイライト
    23. 初めてのMiddleman:Middleman-Blogで記事毎に画像を管理する方法
    24. 初めてのMiddleman:Gulpを使ってサムネイル画像を生成する
    25. 初めてのMiddleman:Middleman-OGPのOGP画像指定を相対パスで設定する
    26. 初めてのMiddleman:Middleman-OGPでMiddleman-BLogにOGPを設定する
    27. 初めてのMiddleman:Middleman-Titleでタイトルタグを手軽に設定する
    28. 初めてのMiddleman:多言語化 - 言語ファイルの作成とヘルパーの埋め込み
    29. 初めてのMiddleman:Middleman-blogにカテゴリやシリーズなどのカスタムコレクションを追加する方法
    30. 初めてのMiddleman:Bowerで管理されているフォントファイルをインポートする

    コメント・フィードバック