RMagick:用原点旋转图像(矩阵变换)

时间:2015-08-24 15:24:56

标签: ruby rotation imagemagick transform rmagick

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

我创建了一个网站,允许用户在线操作2个图像,并将服务器端的这些图像合成为单个图像。

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

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

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

RMagick文档中的

Somewhere我读到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

My current output

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

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

编辑:显然只有Magick::RVG::Image接受originX&我上面提到的originY参数。仍然无法将当前图像转换为RVG图像。如果我可以将我的Magick :: Image转换为Magick :: RVG :: Image。

,它可能会解决问题

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决这个问题的方法。我必须使用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, ...)

在移动设备上写这个,我会尽快添加一个详细的答案。