Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

MiniMagick入門:Rubyで画像を変換・リサイズ・切り抜きする方法

Rubyアプリケーションで画像を扱っていると、何らかの形で画像を加工したくなる場面は多いはずです。

たとえば、ファイルサイズを小さくしてストレージを節約し、ユーザーのダウンロード時間を短縮するためのリサイズなどが代表例です。

では、どうやって実現すればよいのでしょうか?

その答えとなるのがMiniMagickというgemです。

MiniMagickは、強力な画像処理ツール「ImageMagick」とRubyコードをつなぐインターフェースであり、リサイズや回転、切り抜きなど、多彩な変換処理をRubyのメソッドとして直感的に扱えます。

事前準備:ImageMagickのインストール

まず最初に、お使いのOSのパッケージマネージャー(macOSならHomebrew、Ubuntuならaptなど)を使ってImageMagickをインストールするか、プロジェクトの公式サイトからインストーラーをダウンロードしてください。

# macOS(Homebrew)の場合
brew install imagemagick

# Ubuntu / Debian の場合
sudo apt-get install imagemagick

ImageMagickが用意できたら、Gemfileにmini_magickを追加してbundle installを実行しましょう。

gem 'mini_magick'

これで準備完了です。それでは、具体的な使い方を見ていきましょう。

画像を開く

画像を開く方法は2種類あります。

  1. MiniMagick::Image.open → 元画像のコピーを作成して開く
  2. MiniMagick::Image.new → 元画像そのものを直接編集する

openメソッドはローカルのファイル名だけでなくURLも受け付けるため、Web上から直接画像を取得できます。

ここでは、無料写真共有サービスUnsplashの画像を使用します。

MiniMagick入門:Rubyで画像を変換・リサイズ・切り抜きする方法

画像の読み込みは次のように行います

require 'mini_magick'

image = MiniMagick::Image.open(
  "https://images.unsplash.com/photo-1516295615676-7ae4303c1c63"
)

画像を読み込んだら、サイズや形式などの情報を取得できます。

以下はその例です

image.dimensions
# => [3963, 5944]

image.type
# => "JPEG"

image.human_size
# => "20.7663MB"

なんと約20MBもの巨大な画像です。これをリサイズしてみましょう。

また、縦向きの画像を見やすいように横向きへ回転させたいところです。

リサイズと回転

画像のリサイズは次のように行います。

image.resize "500x500"

この指定では正確に500x500ピクセルになります。一方、アスペクト比(縦横比)を維持したままパーセンテージで拡大・縮小したい場合は、次のように書きます。

image.resize "25%"

これは「元のサイズの25%に縮小する」という意味であり、「25%だけ縮小する」ではない点に注意してください。

回転させる場合rotateメソッドを使います。角度を引数に渡すだけでOKです。

# 時計回りに90度回転
image.rotate "90"

# 反時計回りに90度回転
image.rotate "-90"

変更を適用するには、ファイルをディスクに書き戻す必要があります。

やり方はこちら

image.write("/tmp/new_image.jpg")

なお、openではなくnewで元画像を直接編集モードで開いた場合は、writeを呼ぶ必要はありません。

画像の切り抜き(クロップ)

不要な部分を取り除いたり、画像を小さくしたりするには、クロップ(切り抜き)が便利です。

構文は次のとおりです

<width> x <height> +<xoffset> +<yoffset>

たとえば、画像の下半分を切り出したい場合はこう書きます。

image.crop "100%x50%+0+0"

逆に、左右半分ずつに分割するような縦方向の切り抜きならこちらです。

image.crop "50%x100%+0+0"

数値をいろいろと試しながら、目的の切り抜き範囲を見つけてみてください。

丸型(円形)画像の作成

画像を丸く加工したい場合は、複数のメソッドを組み合わせる必要があります。

コード例はこちら

MiniMagick::Tool::Convert.new do |img|
  img.size '3900x5000'
  img <<   'xc:transparent'

  img.fill "apple.jpg"

  img.draw "translate 2000, 2500 circle 0,0 2000,0"
  img.trim

  img << 'circle.png'
end

このコードは、まず指定したサイズ(丸くしたい元画像と同じサイズ)の透明なキャンバスを作成します。

その後、キャンバスに画像を描き込み、中央に円を描画して、円の外側の部分をすべて取り除きます。

最後に、結果を「circle.png」として保存します。

ポイントとして、translate 2000, 2500はキャンバス中心の座標を表し、circle 0,0 2000,0内の2000は円の半径を意味します。

枠線(ボーダー)の追加

mini_magickを使えば、画像に枠線を追加するのはとても簡単です。

img.border 10

枠線の色は次のように指定できます。

img.bordercolor("white")

newではなくopenで画像を開いている場合は、忘れずにwriteで変更を保存してください。

画像の最適化

画像の最適化は、単にサイズを小さくすること以上の効果をもたらします。

たとえば、stripメソッドを使えば、カメラの撮影情報などのメタデータを削除でき、ファイル容量をさらに抑えられます。

使い方はこちら

image.strip

さらに高度な最適化を行いたい場合は、image_optimのようなgemを組み合わせるとよいでしょう。

require 'image_optim'

image_optim.optimize_image!('orange.jpg')

まとめ

本記事では、Rubyのmini_magick gemを使って、画像の回転・リサイズ・切り抜き・丸型加工・枠線追加・メタデータ削除による最適化といった変換処理を行う方法を学びました。

まずはImageMagickをインストールし、opennewの違いを理解した上で、自分のアプリケーションに合わせた画像処理をぜひ試してみてください。

最後までお読みいただきありがとうございました。

  1. Windows PCで大量の画像を一括リサイズする方法

    Windows PCで大量の画像を一括リサイズする方法記事の概要:Windows用の一括画像リサイズツールを活用すれば、時間と手間を大幅に節約できます。本記事では、大量の画像を素早くリサイズする方法をご紹介します。アップロード先のプラットフォームによって求められる画像サイズは異なるため、用途に合わせて画像の寸法を調整する必要があります。通常の画像編集ソフトだけでは対応が難しい場面も多く、プロの写真家は写真管理ソフトを活用して大量の画像を効率的に扱っています。しかし、専門知識がない方でも安心して使える専用ツールが存在します。PCに一括画像リサイズツールを導入すれば、1枚ずつ画像を変換するという面

  2. 画像リサイズツールで画像の向きを調整・拡大する方法を徹底解説

    「百聞は一見に如かず」という言葉の通り、多くの人は長い文章を読むよりも、画像を見る方が好みです。この傾向が、言語の壁を越えて直感的に理解できるインフォグラフィックや情報系画像の普及につながりました。こうしたコンテンツを作成するには、豊富な画像ストックと画像編集ツールが必要です。本記事では、画像の向き(オリエンテーション)の調整や拡大縮小を簡単に行える便利なツールをご紹介します。 Image Resizer:最高の画像編集ツール Image Resizerは、複数の画像をまとめてリサイズ、反転、回転、名前変更、フォーマット変換できる優れたツールです。画質を劣化させることなく写真のサイズを変更で