我有Image
模型和Movie
模型,Movie
可以有很多images
。我正在存储3个版本的图像,big, medium and small
。
在我的应用程序中,用户可以选择特定大小的图像,可以说4个“中等”大小的图像然后用户可以共享它们。最少3张图片,最多5张。
我需要使用所有选定的中等大小的4张图像创建图像。我不想单独发送这些图像,我想将其作为单个图像发送。
我正在使用Carrierwave
和MiniMagick
。
感谢您的帮助!
答案 0 :(得分:4)
假设这里真正的问题是用minimagick合成图像,这里有一些代码。请注意,我在Movie中添加了一个名为“composite_image”的字段,并且我已经确定附加到Image的上传器名为“file”。
def render_composite_image(source_images, coordinates)
temp_file = TempFile.new(['render_composite_image', '.jpg'])
img = MiniMagick::Image.new(temp_file.path)
img.run_command(:convert, "-size", "#{ COMPOSITE_WIDTH }x#{ COMPOSITE_HEIGHT }", "xc:white", img.path)
source_images.each_with_index do |source_image, i|
resource = MiniMagick::Image.open(source_image.file.path)
img = img.composite(resource) do |composite|
composite.geometry "#{ coordinates[i].x }x#{ coordinates[i].y }"
end
end
img.write(temp_file.path)
self.update_attributes(composite_image: temp_file)
end
关于此代码的几点说明:
source_images
是您想要合成的图像数组。
coordinates
是一个坐标值数组,用于表示每个图像在最终合成中的位置。坐标索引对应于相应的source_image索引。另请注意,如果坐标为正,则需要包含“+”字符,例如“+50”。 (您可能需要尝试找到所需的坐标。)
如果您的图片未在本地存储,则需要使用source_image.file.url
代替source_image.file.path
。
此代码编写为在Movie模型的上下文中运行,但可以随意移动。