Изменение размера в стиле Flickr с помощью attachment_fu

Я хочу, чтобы attachment_fu изменял размер моих миниатюр аналогично тому, как это обрабатывают flickr, facebook и twitter: если мне нужна миниатюра 100x100, я хочу, чтобы миниатюра была точно 100x100 с обрезанием всего лишнего, чтобы сохранить соотношение сторон.

Любые идеи?


person Mike Sutton    schedule 11.02.2010    source источник


Ответы (4)


Чтобы настроить миниатюры 100x100, добавьте в свою модель следующее:

  has_attachment :content_type => :image,
                 :storage => IMAGE_STORAGE,
                 :max_size => 20.megabytes,
                 :thumbnails => {
                   :thumb  => '100x100>',
                   :large  => '800x600>',
                 }

(В этом примере я создаю миниатюру 100x100, а также «большой» размер 800x600 в дополнение к сохранению исходного размера.)

Кроме того, имейте в виду, что миниатюра может быть не точно 100x100; он будет иметь максимальный размер 100x100. Это означает, что если оригинал имеет соотношение сторон 4:3, миниатюра будет иметь размер 100x75. Я не совсем уверен, что это то, что вы имели в виду под «ровно 100x100 с обрезанием всего лишнего, чтобы сохранить соотношение сторон».

person pkaeding    schedule 11.02.2010
comment
Модификатор › просто устанавливает самый большой размер › Мне нужно изображение ровно 100x100 с сохранением соотношения сторон, независимо от исходных размеров изображения. - person Mike Sutton; 12.02.2010
comment
@Mike Sutton: я немного запутался ... что, если входное изображение не квадратное? Как получить миниатюру размером ровно 100 x 100, сохранив при этом соотношение сторон? Предположим, у вас есть входное изображение размером 1000x750. Каким должен быть результат? - person pkaeding; 12.02.2010
comment
Лишнее нужно обрезать, чтобы изображение стало квадратным. - person Mike Sutton; 12.02.2010
comment
Итак, в случае изображения высотой 1000 пикселей и шириной 750 пикселей результирующее изображение должно обрезать 25% верхней части? или 25% дна? или 12,5% сверху и 12,5% снизу? - person pkaeding; 12.02.2010
comment
Верх и низ. Посмотрите, как это делает flickr, например, здесь: flickr.com/photos/romanlily/ наборы/81690 - person Tomas Markauskas; 13.02.2010

Добавьте это в свою модель

protected  

  # Override image resizing method  
  def resize_image(img, size)  
    # resize_image take size in a number of formats, we just want  
    # Strings in the form of "crop: WxH"  
    if (size.is_a?(String) && size =~ /^crop: (\d*)x(\d*)/i) ||  
        (size.is_a?(Array) && size.first.is_a?(String) &&  
          size.first =~ /^crop: (\d*)x(\d*)/i)  
      img.crop_resized!($1.to_i, $2.to_i)  
      # We need to save the resized image in the same way the  
      # orignal does.  
      self.temp_path = write_to_temp_file(img.to_blob)  
    else  
      super # Otherwise let attachment_fu handle it  
    end  
  end

и измените размер миниатюры на:

:thumbnails => {:thumb => 'crop: 100x100' }

источник:

http://stuff-things.net/2008/02/21/quick-and-dirty-cropping-images-with-attachment_fu/

person deb    schedule 11.02.2010
comment
В модели работать не будет. Я пробовал редактировать плагин сам по себе, но он все равно не сохраняет соотношение сторон. - person Mike Sutton; 12.02.2010

В спецификации можно указать директиву обрезки:

has_attachment :content_type => :image,
  :thumbnails => {
    :thumb  => '100x100#'
}

Memonic: '#' выглядит как инструмент обрезки.

Изменить: Исправление

has_attachment :content_type => :image,
  :thumbnails => {
    :thumb  => '100x100!'
}

Предыдущий метод был для Paperclip, который имеет другое обозначение.

person tadman    schedule 11.02.2010
comment
Может быть, именно в этом Paperclip лучше, чем attachment_fu. Хм. - person tadman; 12.02.2010
comment
На самом деле, я просмотрел кое-какие старые файлы attachment_fu, которые у меня есть, и я использовал «100x100!». указать обрезку. - person tadman; 12.02.2010
comment
! делает изменение размера без сохранения соотношения сторон. - person Mike Sutton; 12.02.2010

Мое решение состояло в том, чтобы углубиться в папку плагинов attachment_fu (vendor/plugins) и отредактировать файл rmagick_processor.rb. Сначала я переименовал resize_image в resize_image_internal, а затем добавил:

  def resize_image(img, size)  
    # resize_image take size in a number of formats, we just want  
    # Strings in the form of "square: WxH"  
    if (size.is_a?(String) && size =~ /^square: (\d*)x(\d*)/i) ||  
        (size.is_a?(Array) && size.first.is_a?(String) &&  
          size.first =~ /^square: (\d*)x(\d*)/i)  
        iw, ih = img.columns, img.rows
        aspect = iw.to_f / ih.to_f
        if aspect > 1
            shave_off = (iw - ih) / 2
            img.shave!(shave_off, 0)
        else
            shave_off = (ih-iw) / 2
            img.shave!(0, shave_off)
        end
        resize_image_internal(img, "#{$1}x#{$2}!")
    else  
      resize_image_internal(img, size) # Otherwise let attachment_fu handle it  
    end  
  end

Теперь я могу использовать «квадрат: 100x100» в качестве строки геометрии. Обратите внимание, что приведенный выше код предполагает, что требуемый результат является квадратным.

person Mike Sutton    schedule 13.02.2010