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