初めての Middleman シリーズ初めてのMiddleman:Gulpを使ってサムネイル画像を生成する
はじめに
前回はMiddleman-Blogの記事毎に画像を管理する方法について紹介しました。今回はこの画像を自由ににリサイズできるようにしたいと思います。Middlemanの拡張機能を色々と探し試しましたが、残念ながら実用に耐えるものはありませんでした。
- Middleman Simple Thumbnailer(cropできない、適切な画像が生成されない、ヘルパーをMarkdownで使えない)
- Middleman Thumbnailer(cropできない、ヘルパーをMarkdownで使えない)
- Middleman::Automatic::Clowncar(シンプルな使い方ができない)
使い方が悪いということもあるかもしれません。他に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用画像やサムネイルの作成も簡単にできるようになります。
今回はここまで。
シリーズ
- 初めてのMiddleman:rbenv, bundler 環境でMiddlemanを使ったHello World
- 初めてのMiddleman:レイアウト機能でレイアウトとコンテンツを分離する
- 初めてのMiddleman:パーシャルを使ったコンテンツのモジュール化
- 初めてのMiddleman:SCSSのコンパイルとテンプレートの基礎
- 初めてのMiddleman:Sass MixinライブラリのBourbon, Neatを導入してみる
- 初めてのMiddleman:データファイルとデータファイルを使った動的ページ生成
- 初めてのMiddleman:サイトにブログ機能を追加する
- 初めてのMiddleman:Amazon S3にビルドされたファイルを同期する
- 初めてのMiddleman:HTML/CSS/JS/画像をビルド時に圧縮する
- 初めてのMiddleman:設定について
- 初めてのMiddleman:静的サイトのキャッシュとasset_hash拡張を使ったキャッシュのパージ
- 初めてのMiddleman:Middleman::S3Syncで使うAWS IAMユーザーのアクセスキー管理方法について
- 初めてのMiddleman:Helperを使ってGravatarのアイコンを表示する
- 初めてのMiddleman:アセットパイプラインを使った外部アセットファイルの読み込みと結合
- 初めてのMiddleman:Bowerを使ってjQueryなどのライブラリをロードする
- 初めてのMiddleman:スケルトンを自作する方法
- 初めてのMiddleman:Middleman Blogの記事データを使いやすく管理する方法
- 初めてのMiddleman:Middleman-blogのシングルブログを前提としたSkeletonを作った
- 初めてのMiddleman:Middleman-blogでマルチブログを試してSkeletonを作った
- 初めてのMiddleman:Markdown EngineをkramdownからRedcarpetに切り替える
- 初めてのMiddleman:RedcarpetとMiddleman::Rougeを使ったシンタックスハイライト
- 初めてのMiddleman:Middleman-Syntaxを使ったシンタックスハイライト
- 初めてのMiddleman:Middleman-Blogで記事毎に画像を管理する方法
- 初めてのMiddleman:Gulpを使ってサムネイル画像を生成する
- 初めてのMiddleman:Middleman-OGPのOGP画像指定を相対パスで設定する
- 初めてのMiddleman:Middleman-OGPでMiddleman-BLogにOGPを設定する
- 初めてのMiddleman:Middleman-Titleでタイトルタグを手軽に設定する
- 初めてのMiddleman:多言語化 - 言語ファイルの作成とヘルパーの埋め込み
- 初めてのMiddleman:Middleman-blogにカテゴリやシリーズなどのカスタムコレクションを追加する方法
- 初めてのMiddleman:Bowerで管理されているフォントファイルをインポートする