Точные размеры с помощью imageMagic и Carrierwave - PullRequest
1 голос
/ 03 мая 2019

Так что я знаю, как работают imageMagik и carrierwave, но вопрос в том, могут ли они точно изменить размер изображения. Я попытался с process resize_to_fit: [100, 100] и загрузил 800*200 изображение, которое привело к 100*27 вместо 100*100. resize_to_fill делает это, но обрезает изображение, которое не должно быть. Есть ли способ изменить размер до точной ширины и высоты в Ruby on Rails, используя carrierwave.

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Резюме

Carrierwave передает блок с resize_to_fit и resize_to_limit методу manipulate! для обрезки изображения.

Изменяя этот блок, вы можете изменить обрезку / изменение размера. Carrierwave вызывает экземпляр Magick::Image метод change_geometry по этой линии .

Метод change_geometry поддерживает изменение размера метода путем указания ограничений. Например, вы можете указать, что размер изображения должен быть изменен таким образом, чтобы соотношение сторон сохранялось, но результирующее изображение не должно превышать 640 пикселей в ширину и 480 пикселей в высоту.

Аргументом может быть либо строка геометрии , либо объект геометрии . Change_geometry уступает блоку, передавая новые значения ширины и высоты на основе аргумента относительно себя. Возвращаемое значение является возвращаемым значением блока.

Вам необходимо передать блок на manipulate! аналогично приведенному ниже примеру:

def resize_no_crop(width, height)
  width = dimension_from width
  height = dimension_from height
  manipulate! do |img|
      # change the below geometry object to achieve your effect
      # geometry = Magick::Geometry.new(width, height, 0, 0,    Magick::GreaterGeometry)
      new_img = img.change_geometry(geometry) do |new_width, new_height|
      img.resize(new_width, new_height)
    end
    destroy_image(img)
    new_img = yield(new_img) if block_given?
    new_img
  end
end

Установите объект geometry согласно вашим желаниям

geometry = Magick::Geometry.new(width, height, 0, 0, !)

как я прочитал в документации, последние параметры ! имеют следующий эффект

! Используйте этот флаг, если хотите, чтобы новое изображение имело размер, точно соответствующий атрибутам width и height.

ImageMagick инструмент командной строки и Rmagick api docs предоставляют дополнительную информацию.

Объяснение

Carrierwave использует miniMagick для выполнения процесса изменения размера .

Gem ImageProcessing использует MiniMagick, мини-замену RMagick, использующую инструменты командной строки ImageMagick, для создания команды "convert", которая выполняет обработку.

Так работает метод resize_to_limit, он может помочь вам создать собственный метод с использованием инструментов командной строки Rmagick и ImageMagick.

module MiniMagick
  extend ActiveSupport::Concern

  included do
    require "image_processing/mini_magick"
  end

  module ClassMethods
    def convert(format)
      process :convert => format
    end

    def resize_to_limit(width, height)
      process :resize_to_limit => [width, height]
    end
  end
end

method управляет изображениями с помощью инструмента командной строки ImageMagick и Rmagick . Вы можете посетить вышеуказанные сайты, чтобы прочитать их документацию.

Как вы можете прочитать ниже resize_to_limit управляет изображением, создавая новый экземпляр Magick::Geometry и передавая width, height, x,y и flag

def resize_to_limit(width, height)
  width = dimension_from width
  height = dimension_from height
  manipulate! do |img|
     # Read The Explanation below
  end
end

Carrierwave создал свой собственный manipulate! метод , который будет повторяться с оператором yield и обрезать / изменять размер изображения

  image.each_with_index do |frame, index|
    frame = yield(*[frame, index, options].take(block.arity)) if block_given?
    frames << frame if frame
  end

Метод each_with_index будет перебирать между manipulate! do ... end с оператором yield.

*[frame, index, options].take(block.arity), .take(block.arity) будет проходить только frame, так как он называется только с одним параметром .

Переменная frame будет равна возвращаемому new_image.

geometry = Magick::Geometry.new(width, height, 0, 0, Magick::GreaterGeometry)
new_img = img.change_geometry(geometry) do |new_width, new_height|
  img.resize(new_width, new_height)
end
destroy_image(img)
new_img = yield(new_img) if block_given?
new_img

Вы можете узнать больше о Image :: Magick class и на rmagick.github.io , чтобы лучше понять, как работает процесс выбора кадра.

0 голосов
/ 04 мая 2019

@ ImranNaqvi - это всего лишь версия вашего изображения, и отображение его в виде HTML - это еще одна история, верно?Таким образом, вы все равно оказываете <img src="your_img_100_27_url" width="100" height="100"> извините, если я вас неправильно понял.

...