标签最适合Rmagick的图像吗?

时间:2011-05-27 09:30:00

标签: ruby imagemagick rmagick

  

使用标签生成特定“-size”图像的最大诀窍是不为标签指定“-pointsize”。发生这种情况时,IM可以自由选择最适合所请求图像大小的字体大小。也就是说,绘制的文本将被调整为适合给定的大小! 1

ImageMagick文档中的这个摘录表明,强制文本适合图像大小非常容易。

我试图找到一种方法来修复固定宽度Rmagick图像中的文本而没有成功。

    text = Draw.new
    text.annotate layer, layer_data['width'], layer_data['height'], layer_data['x'], layer_data['y'], layer_content do

      self.font_family = 'arial'
      self.fill = '#000000'

    end

我逻辑上试图在没有分数的情况下使用注释,但是Rgmagick只是交换了12的默认分数。

Rmagick是否有办法让图书馆计算出最佳的点数,使文字适合固定宽度的图像,就像在ImageMagick中一样。

1 个答案:

答案 0 :(得分:3)

我最近找到了实现这一结果的方法。我无法找到用于在边界框内拟合文本的磅值,并且最初使用get_type_metrics来计算我要使用的X和Y比例。

metrics = text.get_type_metrics(image_canvas, image_text)

x_scale = container_width > metrics.width ? (container_width / metrics.width) : (metrics.width / container_width)
y_scale = container_height > metrics.height ? (container_height / metrics.height) : (metrics.height / container_height)
scale = container_height > metrics.height ? [x_scale, y_scale].min : [x_scale, y_scale].max

然而,这感觉有点片状,并且最近使用了这个小片段。

image_canvas = Magick::Image.new(canvas_width, canvas_height)

text_container = Magick::Image.read("label:#{image_text}") {
    self.stroke = 'transparent'
    self.fill = '#0000A9'
    self.size = "#{text_container_width}x#{text_container_height}"
}.first

image_canvas.composite!(text_container, text_x_offset, text_y_offset, Magick::SrcOverCompositeOp)

基本上所有这一切都是创建一个主图像(如果你想在图像上有多个元素,并在主图像上覆盖一个Magick::Image对象作为自动调整大小的文本元素。

或者,如果您使用的是多行文字,则可以将label更改为caption,如下所示:Magick::Image.read("caption:#{image_text}")