5

需要一种简单的方法来四舍五入图像。我需要角落是透明的。此链接显示如何通过命令行执行此操作:

http://www.imagemagick.org/Usage/thumbnails/#rounded

我需要的是相应的 RMagick\Ruby 代码...谢谢!

4

5 回答 5

12

在源代码中包含 Rmagick。确保将包含放在类声明中。

require 'rmagick'
include Magick

创建一个方法,像这样

def thumb(source_image, geometry_string, radius = 10)
  source_image.change_geometry(geometry_string) do |cols, rows, img| 

    # Make a resized copy of the image
    thumb = img.resize(cols, rows)

    # Set a transparent background: pixels that are transparent will be
    # discarded from the source image.
    mask = Image.new(cols, rows) {self.background_color = 'transparent'}

    # Create a white rectangle with rounded corners. This will become the
    # mask for the area you want to retain in the original image.
    Draw.new.stroke('none').stroke_width(0).fill('white').
        roundrectangle(0, 0, cols, rows, radius, radius).
        draw(mask)

    # Apply the mask and write it out
    thumb.composite!(mask, 0, 0, Magick::CopyOpacityCompositeOp)
    thumb
  end
end

像这样调用方法

source_image = Image.read('my-big-image.jpg').first
thumbnail_image = thumb(source_image, '64x64>', 8)
thumbnail_image.write('thumb.png')

我以这种方式构建它是因为在创建缩略图时我已经为其他目的打开了图像。将文件操作直接放在方法中可能更有意义。

此外,您可能想看看几何字符串如何工作http://www.imagemagick.org/RMagick/doc/imusage.html#geometry

于 2011-09-16T21:01:52.103 回答
4

使用Fitter Man的代码CarrierWave::RMagick

方法:

def resize_and_round(geometry_string, radius = 10)
  manipulate! do |original|
    original.change_geometry(geometry_string) do |cols, rows, img| 

      # Make a resized copy of the image
      thumb = img.resize(cols, rows)

      # Set a transparent background: pixels that are transparent will be
      # discarded from the source image.
      mask = Magick::Image.new(cols, rows) {self.background_color = 'transparent'}

      # Create a white rectangle with rounded corners. This will become the
      # mask for the area you want to retain in the original image.
      Magick::Draw.new.stroke('none').stroke_width(0).fill('white').
          roundrectangle(0, 0, cols, rows, radius, radius).
          draw(mask)

      # Apply the mask and write it out
      thumb.composite!(mask, 4,4, Magick::CopyOpacityCompositeOp)
      thumb
    end
  end
end

用法:

process :resize_and_round => ['200x200', 20]
于 2012-10-25T22:11:23.050 回答
3

如果您使用的是回形针,请查看http://loo.no/articles/rounded-corners-with-paperclip

于 2010-04-26T20:40:19.347 回答
2

一般来说,我对 RMagick 的运气很差,以至于我通常发现使用其中的命令进行 system() 调用来修改图像更容易。如果您采用这种方法,则可以完全使用您引用的链接中的命令。

于 2010-04-26T22:59:50.943 回答
1

这是一种使用 CarrierWave 和 RMagick 在图像上创建圆角的方法:

http://dmathieu.com/articles/development/create-your-own-carrierwave-processors/

于 2011-05-23T20:57:02.797 回答