【问题标题】:Getting RMagick/ImageMagick gravity with text使用文本获取 RMagick/ImageMagick 重力
【发布时间】:2016-03-15 22:45:22
【问题描述】:

这是 Ruby 代码:

require 'rmagick'

include Magick

img = Image.new(300, 300)
draw = Draw.new

draw.line(0, 150, 300, 150)
draw.line(150, 0, 150, 300)

# for each of known gravity constants...
%w[NorthWestGravity NorthGravity NorthEastGravity WestGravity CenterGravity EastGravity SouthWestGravity SouthGravity SouthEastGravity].
each{|g|
  # set gravity to this value...
  draw.gravity Magick.const_get(g)
  # ...and draw text with this constant name
  draw.text 150, 150, g
}

draw.draw(img)

img.write('tmp/gravity.png')

这是它产生的图像:

对于东南/西北和类似的重力,结果与预期一致(文本接近 150,150,向所需方向移动)。但是对于 South、North 和其他人来说,结果真的很奇怪。

据我从代码中可以理解,RMagick 只是将重力和文本命令转换为相应的 ImageMagick 绘图原语,所以,我想它在 ImageMagick 的重力概念中是我无法理解的。

这是什么?..

【问题讨论】:

    标签: ruby imagemagick rmagick


    【解决方案1】:

    我想它在 ImageMagick 的重力概念中是我无法理解的。

    这是什么?..

    了解发生了什么的关键是找到 CenterGravity 文本。

    左移150px,下移150px

    现在比较比较NorthWestGravity位置。

    也分别向左和向下平移了 150 像素。看到趋势了吗?

    你的问题在于这条线......

    draw.text 150, 150, g
    

    Magick::Draw API 映射到 MVG 规范。使用Magick::Draw.push & Magick::Draw.pop 控制绘图上下文。

    从 cmets 编辑...

    要设置要绘制的文本的原点,您需要在评估文本/类型指标后计算位置。

    示例。

    require 'rmagick'
    
    include Magick
    
    img = Image.new(300, 300) {
      self.background_color = "palegreen"
    }
    draw = Draw.new
    dotes = Draw.new # Dotes added for point of origin
    dotes.fill = "red"
    
    cursor = 1
    # for each of known gravity constants...
    %w[NorthWestGravity NorthGravity NorthEastGravity WestGravity CenterGravity EastGravity SouthWestGravity SouthGravity SouthEastGravity].
    each{|g|
      offsetX = 150
      offsetY = cursor * 25
      dotes.circle offsetX, offsetY, offsetX+2, offsetY+2
      # Get metrics of text
      metrics = draw.get_type_metrics(img, g)
      # Full width
      if %w[NorthWestGravity WestGravity SouthWestGravity].include? g then
        offsetX -= metrics[:width]
      end
      # Full height
      if %w[SouthWestGravity SouthGravity SouthEastGravity].include? g then
        offsetY += metrics[:ascent]
      end
      # Half width
      if %w[NorthGravity SouthGravity CenterGravity].include? g then
        offsetX -= metrics[:width] / 2
      end
      # Half height
      if %w[WestGravity CenterGravity EastGravity].include? g then
        offsetY += metrics[:ascent] / 2
      end
      draw.text offsetX, offsetY, g
      cursor += 1
    }
    dotes.draw(img)
    draw.draw(img)
    
    img.write('output.png')
    

    【讨论】:

    • 哇。现在真的很有意义!谢谢你:)
    • ...所以,对于我的“预期”结果(在某个点附近绘制文本,但方向不同),没有简单的解决方案,对吧?..
    • 啊,是的,你需要做一些简单的数学工作,但没有什么不能组合成一个单行子类。
    • 是的,谢谢,我已经提供了 get_type_metrics 解决方案;只是想知道这是否对这项任务来说不是矫枉过正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多