RMagick закругленные углы - PullRequest
       28

RMagick закругленные углы

4 голосов
/ 26 апреля 2010

Нужен простой способ округления изображения. Мне нужно, чтобы углы были прозрачными. Эта ссылка показывает, как это сделать через командную строку:

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

Мне нужен соответствующий код RMagick \ Ruby ... Спасибо!

Ответы [ 5 ]

10 голосов
/ 17 сентября 2011

Включите Rmagick в ваш исходный код. Обязательно поместите include внутри объявления класса.

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

4 голосов
/ 26 октября 2012

Используя 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

Usage:

process :resize_and_round => ['200x200', 20]
2 голосов
/ 27 апреля 2010

Если вы используете скрепку, отметьте http://loo.no/articles/rounded-corners-with-paperclip

1 голос
/ 24 мая 2011

Это метод использования CarrierWave и RMagick для создания закругленных углов на изображениях:

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

1 голос
/ 27 апреля 2010

Вообще мне так не повезло с RMagick, что мне обычно проще просто выполнить системный вызов () с командой для изменения изображений. Если вы выбрали такой подход, вы можете использовать именно ту команду, на которую ссылаетесь.

...