Базовое изменение размера изображения в Ruby on Rails - PullRequest
13 голосов
/ 14 марта 2010

Я создаю небольшой сайт для обмена фотографиями для внутренней сети нашего дома, и у меня есть функция загрузки, которая загружает фотографию в исходном размере в базу данных. Однако я также хочу сохранить фотографию в четырех других размерах: W = 1024, W = 512, W = 256 и W = 128, но только размеры меньше исходного размера (например, если исходная ширина равна 511, генерировать только 256 и 128). Изображение с шириной 128 всегда должно быть сгенерировано (потому что это эскиз). Кроме того, изменение размера всегда должно быть пропорционально ширине и высоте. Как я могу это реализовать? У меня уже есть этот код для загрузки фото:

pic.rb <- модель </h1> def image_file=(input_data) self.filename = input_data.original_filename self.content_type = input_data.content_type.chomp self.binary_data = input_data.read # here it should generate the smaller sizes #+and save them to self.binary_data_1024, etc... end new.rb <- просмотр </h1> <h1>New pic</h1> <% form_for(@pic, :html => {:multipart => true}) do |f| %> <%= f.error_messages %> <p> <%= f.label :title %><br /> <%= f.text_field :title %> </p> <p> <%= f.label :description %><br /> <%= f.text_field :description %> </p> <p> <%= f.label :image_file %><br /> <%= f.file_field :image_file %> </p> <p> <%= f.submit 'Create' %> </p> <% end %> <%= link_to 'Back', pics_path %> Спасибо

Ответы [ 5 ]

26 голосов
/ 14 марта 2010

Вы можете изменить размер с помощью RMagick gem.

Это просто пример, который вы можете адаптировать:

require 'RMagick'

f = File.new( File.join(save_path, self.filename), "wb"  )
f.write form_file.read #remeber to set :html=>{:multipart => true} in form
f.close

image = Magick::Image.read(self.filename).first
image.change_geometry!("640x480") { |cols, rows, img|
    newimg = img.resize(cols, rows)
    newimg.write("newfilename.jpg")
}

Подробнее здесь: http://www.imagemagick.org/script/api.php#ruby

10 голосов
/ 14 марта 2010

Просто используйте скрепку или attachment_fu

2 голосов
/ 17 апреля 2013

Я попробовал следующий способ. Работает нормально. Надеюсь, это кому-нибудь поможет.

1.Добавьте следующий драгоценный камень в Gemfile:

gem "ImageResize", "~> 0.0.5"

2.runle bundle

3.используйте это в функции контроллера:

require 'rubygems'
require 'ImageResize'

#input_image_filename, output_image_filename, max_width, max_height
Image.resize('big.jpg', 'small.jpg', 40, 40)
2 голосов
/ 25 марта 2013

Зная, что это старый, но вот очень хороший Railscast по этой теме: http://railscasts.com/episodes/253-carrierwave-file-uploads Использует rmagic и carrierwave.

1 голос
/ 30 июня 2015

Существует драгоценный камень под названием "Refile". Это просто супер. Пойдите и проверьте этот учебник о том, как его использовать. https://gorails.com/episodes/file-uploads-with-refile вот как это сделать.

Добавьте это в свой файл gem

gem 'refile', '~> 0.4.2', require: ["refile/rails", "refile/image_processing"]

Создайте поле таблицы, используя рельсовую миграцию в вашей таблице как image_id типа string. Теперь необходимо добавить в это поле и отобразить изображение.

Используйте это в форме загрузки, в основном form_for do | f |

 <%= f.attachment_field :image %>

если вы используете рельсы 4, убедитесь, что вы передали рельсам строгие параметры.

Поместите это в файл model.rb, в котором вы храните изображение (под именем класса класса)

attachment :image

Отображение изображения просто.

<%= image_tag attachment_url(current_user,:image, :fill, 200, 170, format: "jpg") %>
...