3

2 色を使用して画像のキャプションを作成する必要があります。他の色の 1 つを除いて、すべての単語は黒で表示されます...

私はRMagickのドキュメントを読んでいますが、これを行う方法が見つかりません...テキストを作成するために現在使用しているのは次のとおりです。

txt_name = Draw.new
image.annotate(txt_name, 0,0,0,0, "This RED has to be in red") do
    self.gravity = Magick::NorthGravity
    self.pointsize = 20
    self.fill = '#000000'
    txt_name.font_weight = 100
    self.font_family = 'Arial'
end

何か案が??または、これを機能させるために読むべきもの??

ありがとう!

4

1 に答える 1

4

次のようなものがあなたのために働くはずです。(これはプロセスを示すためだけのものであることに注意してください。このようなコードを本番環境に配置することはお勧めしません。これは独自のクラスに配置することを懇願しています編集:以下を参照):

draw               = Magick::Draw.new

描画オブジェクトにすべてのテキスト属性を設定します。

draw.pointsize     = 20
draw.fill          = '#000000'
draw.gravity       = Magick::NorthGravity
draw.font_weight   = 100
draw.font_family   = "Arial"
draw.font_style    = Magick::NormalStyle

画像オブジェクトを取得します(これは単なる新しい空白の画像です):

image              = Magick::Image.new(300,200)

文字列を設定し、get_type_metricsで測定します。

black_text         = "This "
red_text           = "RED"
remainder          = " has to be in red"
black_text_metrics = draw.get_type_metrics(black_text)
red_text_metrics   = draw.get_type_metrics(red_text)
remainder_metrics  = draw.get_type_metrics(remainder)

黒のテキストで注釈を付けます。

draw.annotate(image, 
              black_text_metrics.width, 
              black_text_metrics.height,
              10,10,black_text)

色を赤に変更し、赤いテキストを追加します。

draw.fill = "#ff0000"
draw.annotate(image,
              red_text_metrics.width,
              red_text_metrics.height,
              10 + black_text_metrics.width, # x value set to the initial offset plus the width of the black text
              10, red_text)

色を黒に戻し、残りのテキストを追加します。

draw.fill = "#000000"
draw.annotate(image,
              remainder_metrics.width,
              remainder_metrics.height,
              10 + black_text_metrics.width + red_text_metrics.width,
              10, remainder)

編集:これは、これをもう少しうまく構成する方法のアイデアをあなたに与えるかもしれません:

TextFragment = Struct.new(:string, :color)

class Annotator
  attr_reader :text_fragments
  attr_accessor :current_color

  def initialize(color = nil)
    @current_color  = color || "#000000"
    @text_fragments = []
  end

  def add_string(string, color = nil)
    text_fragments << TextFragment.new(string, color || current_color)
  end
end


class Magick::Draw
  def annotate_multiple(image, annotator, x, y)
    annotator.text_fragments.each do |fragment|
      metrics   = get_type_metrics(fragment.string)
      self.fill = fragment.color
      annotate(image, metrics.width, metrics.height, x, y, fragment.string)
      x += metrics.width
    end
  end
end

および使用例:

image            = Magick::Image.new(300,200)
draw             = Magic::Draw.new
draw.pointsize   = 24
draw.font_family = "Arial"
draw.gravity     = Magick::NorthGravity
annotator        = Annotator.new #using the default color (black)

annotator.add_string "Hello "
annotator.add_string "World", "#ff0000"
annotator.add_string "!"

draw.annotate_multiple(image, annotator, 10, 10)
于 2012-11-12T19:13:36.313 に答える