1

私のアプリには、TrueTypeファイルとOpenTypeファイルから画像を生成するメソッドを備えたコントローラーがあり、「color」、「arbitrary text」、「background」などのパラメーターを受け取ります。

問題は、パスファイルに空白が含まれている場合です。

def imagefont

  font = Font.find params[:font]
  file = File.basename font.file, File.extname(font.file)
  fontfile = File.path(Pathname.new("public/downloads/#{font.name.slice(0,1).capitalize}/#{file}/#{font.file}"))

  options = {
    :max_width  => 240,
    :text_color => params[:color],
    :font_size  => 35,
    :text       => params[:text],
    :bg_color   => params[:background],
    :font       => fontfile
  }

  if File.exists?(options[:font])

    canvas = Magick::Image.new 50, 50
    image = Magick::Draw.new

    begin

      image.annotate(canvas, 0, 0, 0, 0, options[:text]) do
        image.pointsize = options[:font_size]
        image.font = options[:font]
      end

      metrics = image.get_type_metrics canvas, options[:text]
      canvas = Magick::Image.new(metrics.width, metrics.height){ self.background_color = options[:bg_color] }

      options[:font_size] -= 1

    end while metrics.width > options[:max_width]

    image  = Magick::Draw.new
    image.font options[:font]
    image.font_size options[:font_size]
    image.fill options[:text_color]
    image.text 0, 0, options[:text]
    image.gravity = Magick::CenterGravity
    image.draw canvas

    temp = Tempfile.new([font.file, '.png'])
    canvas.write(temp.path)

    render :text => open(temp.path).read  

  end

end

フォント名に空白が含まれていない限り、上記のコードは機能します。その場合、次のエラーが表示されます。

Magick::ImageMagickError in FontController#imagefont
non-conforming drawing primitive definition `Blick' @ error/draw.c/DrawImage/3146

この場合、フォント名は「A Blick for All Seasons」なので、引用符の問題だと思います。簡単な引用符を付けてみましたが、うまくいきませんでした。

4

1 に答える 1

1

答えはありませんでしたが、解決策はありました。fontfileパラメーターを受け取るgemファイルのメソッドを見つけて変更しました。最初は次のように表示されます。

# File lib/RMagick.rb, line 335
def font(name)
  primitive "font #{name}"
end

簡単な引用符の追加を変更しましたが、正常に機能します。

# File lib/RMagick.rb, line 335
def font(name)
  primitive "font \'#{name}\'"
end

この変更で「プルリクエスト」を送信する必要があると思います。別の答えがない限り。

于 2012-05-30T07:53:25.580 に答える