Как я могу использовать rmagick и carrierwave, чтобы изменить размер изображения до фиксированной ширины и максимальной высоты, где избыточная высота обрезается? - PullRequest
0 голосов
/ 14 октября 2011

Я хочу, чтобы изображение было изменено до определенной ширины (220px), а затем в основном resize_to_fill на максимальной высоте (280px).

Я смотрю на вывод строк и столбцов, когда оно изменяет размеры впроцесс большого пальца, и они не имеют смысла вообще.Показывает, что столбцы равны 220, а строки - 146, когда явно обрезанное изображение очень высокое и высокое разрешение.

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

У меня есть обрезанное изображение, прежде чем я запускаю refreshate_versions!на нем, и это его класс:

process :resize_to_limit => [1000,1000]

version :thumb do
  process :thumbprocess
end

version :med_thumb do
  process :resize_to_fill => [105,80]
end

version :thumb_fill do
  process :resize_to_fill => [164,125]
end

version :preview do
  process :resize_to_limit => [728,620]
end

version :small_thumb do
  process :resize_to_fill => [50,50]
end

def extension_white_list
  %w(jpg jpeg gif png)
end

def thumbprocess
  manipulate! do |img|
    img.change_geometry!('220x') { |cols, rows, img|
      if(rows < 280)
        img.resize!(0, rows)
      else
        img.resize_to_fill!(0,280)
      end
    }
    img = yield(img) if block_given?
    img
  end
end

А затем следующая функция обрезки изображения, вызываемая непосредственно перед refreshate_versions!

def cropImage(x,y,w,h)
    begin
      img = Magick::ImageList.new(self.file.url)
      full_width = img[0].columns
      ratio = full_width.to_f / 398

      real_x = (x.to_i * ratio).round
      real_y = (y.to_i * ratio).round
      real_w = (w.to_i * ratio).round
      real_h = (h.to_i * ratio).round
      self.file.manipulate! do |img|
        img = img.crop!(real_x, real_y, real_w, real_h)
      end
      self.file.store!
      self.file.preview.store!
      self.file = self.file.url

      self.save
      raise Hell.new("Not saved") unless self.saved?
      return true
    rescue Hell => e
      flash[:error] = e.message
      return false
    end
  end
...