Ответ 1
Просто используйте paperclip или attachment_fu
Я создаю небольшой сайт для обмена фотографиями для нашей домашней интрасети, и у меня есть функция загрузки, которая загружает фотографию с исходным размером в базу данных. Тем не менее, я также хочу сохранить фотографию в четырех других размерах: W = 1024, W = 512, W = 256 и W = 128, но только размеры, меньшие, чем исходный размер (например, если исходная ширина равна 511, 256 и 128). Изображение с шириной 128 всегда должно быть сгенерировано (потому что это миниатюра). Кроме того, изменение размера должно всегда иметь пропорциональную ширину и высоту. Как я могу это реализовать? У меня уже есть этот код для загрузки фотографии:
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
<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 %>
Спасибо
Просто используйте paperclip или attachment_fu
Вы можете изменить размер с помощью драгоценного камня RMagick.
Это просто пример, который вы можете адаптировать:
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
Я пробовал следующий путь. Его работа прекрасна. Надеюсь, это поможет кому-то.
1.add после gem в Gemfile:
gem "ImageResize", "~> 0.0.5"
расслоение 2.run
3. Используйте это в функции контроллера:
require 'rubygems'
require 'ImageResize'
#input_image_filename, output_image_filename, max_width, max_height
Image.resize('big.jpg', 'small.jpg', 40, 40)
Зная, что это старый, но здесь очень приятно railscast в соответствии с этой темой: http://railscasts.com/episodes/253-carrierwave-file-uploads Он использует rmagic и несущую волну.
Существует жемчужина под названием "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") %>