@Konboi memo

主に技術に関してつらつらと。

railsでRMagickを使うとサーバーが落ちる問題

やっとこさ止まっていたrails案件が動きだした

そこで、rails で rmagick を使おうと思ったらハマったのでメモ。

以前、rmagick を使った簡単なサンプルは作ってあった。

require "RMagick";

img = Magick::ImageList.new("sample.png");

md = Magick::Draw.new;
md.annotate( img, 0, 0, 0, 50, "hello rmagick") do 
  md.fill      = "white";
  md.stroke  = "red"
  md.pointsize = 30;
  md.font = font;
end

img.write("generate/generate.png");

これは sample.png を読み込んで ( x=0,y=50 ) から hello magick を描く サンプル

これは問題なく動いていた。

ただ、rails から rmagick を使うとサーバーが落ちるという問題に面してしまった。

コードはこんな感じ。

require 'RMagick'

class ImageController < ApplicationController

  def generate_sample

    @text = params[:text]  
    @text ||= 'hello'

    content = File.read("#{Rails.root}/app/assets/images/sample.png")
    img = Magick::Image.from_blob(content).shift
    
    md = Magick::Draw.new
    md.annotate( img, 0, 0, 0, 50, @text ) do
      md.fill = "white"
      md.stroke = "red"
      md.pointsize = 30
    end

    img.write("#{Rails.root}/app/assets/images/sample/sample.png")
  end
end

こんな感じで。 描画の文字をパラメータで渡して描画してくれる 簡単さサンプル。

が、rails s で起動してURLにアクセスすると

RMagick.rb:1635: [BUG] Segmentation fault

こんな感じのエラーが出てサーバーが落ちる。 色々調べてるとここにいきついた。

結論から言うと

ImageMagick をインストールするときに

--disable-openmp

オプションをつけてインストールするといいみたい。 homebrew でインストールし直して、gem も入れなおしたら上手くいった。