ruby-on-rails - RMagick 随重力改变图像范围

标签 ruby-on-rails rmagick

我有一张图片,我想用空白和中心“填充”。

在大多数情况下,我需要将图像的大小从 16 或 32 像素调整到 32 像素。 如果图像是 16 像素,我想在每边添加 8px 的空白,使其成为 32 像素的图像(原始 float 在中间)。

如果是 32 像素的图像,则没有任何变化。

我正在使用 RMagick 进行转换:

image.change_geometry!("#{size}x#{size}") { |cols, rows, img|
  newimg = img.extent(cols, rows)
  newimg.write("#{RAILS_ROOT}#{path}/#{name}.png")
}

工作正常,但较小的图像位于新图像的左上角,而不是居中。 我在看重力设置,它似乎是我需要的,但我不知道如何在调用中指定它?

提前致谢。

最佳答案

检查以下载波函数的实现 http://rubydoc.info/gems/carrierwave/0.5.1/CarrierWave/RMagick#resize_and_pad-instance_method

这是上述方法的一个版本,仅使用 RMagick 依赖

require 'RMagick'
include Magick

module Converter
  def self.resize_and_pad(img, new_img_path, width, height, background=:transparent, gravity=::Magick::CenterGravity)
    img.resize_to_fit!(width, height)
    new_img = ::Magick::Image.new(width, height)
    if background == :transparent
      filled = new_img.matte_floodfill(1, 1)
    else
      filled = new_img.color_floodfill(1, 1, ::Magick::Pixel.from_color(background))
    end
    # destroy_image(new_img)
    filled.composite!(img, gravity, ::Magick::OverCompositeOp)
    # destroy_image(img)
    # filled = yield(filled) if block_given?
    # filled
    filled.write new_img_path
  end
end

关于ruby-on-rails - RMagick 随重力改变图像范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831546/

相关文章:

ruby - 在 Ubuntu 中安装 rmagick gem 时遇到问题(已成功安装 ImageMagick)

ruby-on-rails - 使用载波获取gif中的第一张图像

sql - Ruby on Rails 最佳设计模式而不是单表继承?

ruby-on-rails - 奇怪的路由

ruby-on-rails - Ruby 1.9 中的动态变量作用域

ruby-on-rails - 事务隔离级别和锁定记录,对正在运行的事务中的记录禁用 SELECT

ruby-on-rails - ActiveStorage 不会裁剪变体

python - 从 python 向 Rails 发送 GET 请求时出现错误错误请求行 `m-urlencoded'

ruby-on-rails - RMagick (ImageMagick) 在 fork 进程中运行时挂起

ruby-on-rails - Ruby on Rails RMagick gem 安装问题