2012-11-12 2 views
3

Мне нужно создать заголовок для изображения, используя два цвета, все слова в черном, за исключением одного в другом цвете ...Создайте заголовок с двумя цветами в RMagick

Я читал документацию по 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

Что-то вроде следующего должно работать на вас. (Обратите внимание, что это просто, чтобы показать вам процесс, я не рекомендовал бы поставить такой код в производство Это умоляя положить в своем собственном классе EDIT: см. Ниже):

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) 

Se т до строки и измерить их с 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) 

Edit: Это может дать вам представление о том, как можно структурировать это немного лучше:

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) 
+0

огромная благодарность! – Andres

Смежные вопросы