RMagick:用原点旋转图像(矩阵变换)
RMagick: Rotate image with origin (matrix transform)
tl;dr: 如何使用 RMagick 在给定点旋转图像。
我创建了一个网站,允许用户在线处理 2 张图像,并在服务器端将这些图像合成为一张图像。
我在客户端使用常规 css transform: rotate()
轮换。
在服务器端,我使用 RMagick 的 rotate!
方法旋转图像,但结果与网络版本不同。
(大概是因为原点问题(例如图像发生旋转的点))。
网络版在图像中心旋转(transform-origin: 50% 50%
)。不幸的是,RMagick 默认情况下没有。
我通读了 RMagick 文档,发现 affine_transform
接受矩阵并转换图像。这是正确的使用方法吗?如果是的话,如何使用?我尝试将 css 矩阵传递给该函数,但它不起作用。
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.
,它可能会解决问题
好的,我已经找到解决这个问题的方法。我必须使用 RVG,它是一个创建矢量图形的模块。
#rotate(degree, originX, originY) 方法在 RVG::Image class 中定义,因此我必须用以下内容包装我的 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, ...)
在手机上写这个,我会尽快补充详细的答案。
tl;dr: 如何使用 RMagick 在给定点旋转图像。
我创建了一个网站,允许用户在线处理 2 张图像,并在服务器端将这些图像合成为一张图像。
我在客户端使用常规 css transform: rotate()
轮换。
在服务器端,我使用 RMagick 的 rotate!
方法旋转图像,但结果与网络版本不同。
(大概是因为原点问题(例如图像发生旋转的点))。
网络版在图像中心旋转(transform-origin: 50% 50%
)。不幸的是,RMagick 默认情况下没有。
我通读了 RMagick 文档,发现 affine_transform
接受矩阵并转换图像。这是正确的使用方法吗?如果是的话,如何使用?我尝试将 css 矩阵传递给该函数,但它不起作用。
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.
好的,我已经找到解决这个问题的方法。我必须使用 RVG,它是一个创建矢量图形的模块。 #rotate(degree, originX, originY) 方法在 RVG::Image class 中定义,因此我必须用以下内容包装我的 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, ...)
在手机上写这个,我会尽快补充详细的答案。