【问题标题】:RMagick: Rotate image with origin (matrix transform)RMagick:用原点旋转图像(矩阵变换)
【发布时间】:2015-08-24 15:24:55
【问题描述】:

tl;dr:如何使用 RMagick 在给定点旋转图像。

我创建了一个网站,允许用户在线处理 2 张图像,然后在服务器端将这些图像合成为一张图像。

我在客户端使用常规 css transform: rotate() 进行旋转。 在服务器端,我使用 RMagick 的 rotate! 方法旋转图像,但结果与网络版本不同。 (可能是因为原点问题(例如,旋转发生在图像的哪个点)。

网页版在图像中心旋转 (transform-origin: 50% 50%)。不幸的是,RMagick 默认不支持。

我通读了 RMagick 文档,发现 affine_transform 接受矩阵并转换图像。这是正确的使用方法吗,如果是这样,如何使用?我尝试将 css-matrix 传递给该函数,但它不起作用。

Somewhere 在 RMagick 文档中我读到 Magick::Image#rotate 接受 3 个参数 (degree, originX, originY) 但我的版本说它只接受 2 个参数(实际上要求第二个参数是一个字符串......)。

我的代码:

require 'rmagick'
include Magick

@label = Label.last
image = @label.image
json = @label.processing

image.background_color = "none"
image.resize!(json["size"]["width"], json["size"]["height"])

# how can I set the rotation origin to the center of the image?
image.rotate!(json["rotation"].to_i)

overlay.composite!(image, json["position"]["x"], json["position"]["y"], 
                   Magick::OverCompositeOp)

overlay.write("output5.png")

我目前得到的输出是这个。蓝色方块实际上是代码中的image。心是overlay。

我想要的输出如下所示:(忽略背景、边框和控件)

如果我根本不使用旋转,两个图像是相同的。这就是为什么我认为这是一个轮换问题。两张图片的宽度和高度相同。

编辑:显然只有Magick::RVG::Image 接受我上面提到的originX 和originY 参数。仍然无法将当前图像转换为 RVG 图像。如果我可以将我的 Magick::Image 转换为 Magick::RVG::Image,它可能会解决问题。

【问题讨论】:

    标签: ruby rotation imagemagick transform rmagick


    【解决方案1】:

    好的,我已经找到了解决此问题的方法。我必须使用 RVG 这是一个创建矢量图形的模块。 #rotate(degree, originX, originY) 方法是在 RVG::Image 类中定义的,所以我必须将 Magick::Image 对象包装为:

    require 'rvg/rvg'
    image = RVG::Image.new(magick_image, width, height, x, y)
    canvas = RVG.new(width, height)
    canvas.use image
    overlay.composite!(canvas.draw, ...)
    

    在手机上写这个,我会尽快添加一个详细的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多