Carrierwave и mini_magick определяют ширину и высоту - PullRequest
6 голосов
/ 15 декабря 2010

После небольшого исследования я решил использовать Carrierwave и mini_magick в моем новом приложении rail3.

Я настроил его и он отлично работает.Однако у меня есть один вопрос.Я хотел бы иметь возможность доступа к ширине и высоте, чтобы я мог правильно сформировать HTML.Однако по умолчанию нет данных, из которых можно получить эту информацию.Из-за способа хранения данных я не могу придумать, как добавить их в базу данных.

Может кто-нибудь предложить какие-либо советы или идеи?Это вообще возможно?

Ответы [ 4 ]

14 голосов
/ 26 декабря 2010
class Attachment
  mount_uploader :file, FileUploader

  def image
    @image ||= MiniMagick::Image.open(file.path)
  end
end

И используйте это так:

Attachment.first.image['width'] # => 400
Attachment.first.image['height'] # => 300
2 голосов
/ 19 апреля 2012

Просто для записи, я использовал аналогичное решение, однако, используя файлы с Mongo GridFS, вот оно:

  def image
    @image ||= MiniMagick::Image.read(Mongo::GridFileSystem.new(Mongoid.database).open(file.path, 'r'))
  end
0 голосов
/ 18 июня 2018

Я думаю, что лучший способ - сохранить размеры изображения в модели (базе данных).

В моем случае название модели - attachment. Затем я создал миграцию:

rails g migration add_dimensions_to_attachments image_width:integer image_height:integer

После этого запустите миграцию:

rake db:migrate

В моем файле загрузки изображений app/uploaders/image_uploader.rb, у меня есть:

class ImageUploader < CarrierWave::Uploader::Base

    include CarrierWave::MiniMagick

    process :store_dimensions

    private

    def store_dimensions
      if file && model
        model.image_width, model.image_height = ::MiniMagick::Image.open(file.file)[:dimensions]
      end
    end
  end

При этом размеры изображения сохраняются на этапе загрузки.

Чтобы получить размеры, я просто запускаю attachment.image_width или attachment.image_height

См. Ссылку здесь .

0 голосов
/ 21 июля 2015

Недостаток вычисления Image height / width с использованием RMagick или MiniMagick во время выполнения:

  • Его интенсивная загрузка процессора
  • Для получения изображения и расчета размеров требуется Интернет.
  • Это медленный процесс

К вашему сведению Вы также можете рассчитать изображение Height, Width после Изображение полностью загружено с использованием события load, связанного с <img> тег с помощью jQuery.

Например :

$(document).ready(function(){   
   var $image = $('.fixed-frame img');
   $image.load(function(){
      rePositionLogo($image);
   });

  if($image.prop('complete')){
    rePositionLogo($image);
  }

});

function rePositionLogo($image){
  var height = $image.height();
  var width = $image.width();
  if (width > height) {
    $image.parents('.header').addClass('landscape');
    var marginTop = (105 - $image.height())/2;
    $image.css('margin-top', marginTop + 'px')
  }else{
    $image.parents('.header').addClass('portrait');
  }
}

Будьте осторожны, потому что load() не сработает, когда изображение уже загружено. Это может легко произойти, когда изображение находится в браузере пользователя cache.

Вы можете проверить, загружено ли уже изображение, используя $('#myImage').prop('complete'), который возвращает true при загрузке изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...