2010-03-14 16 views
12

Estoy creando un pequeño sitio para compartir fotos para la intranet de nuestra casa, y tengo una función de carga, que carga la foto en tamaño original en la base de datos. Sin embargo, también quiero guardar la foto en otros cuatro tamaños: W = 1024, W = 512, W = 256 y W = 128, pero solo los tamaños más pequeños que el tamaño original (por ejemplo, si el ancho original es 511, solo genere 256 y 128). Siempre se debe generar la imagen con un ancho de 128 (porque es una miniatura). Además, el cambio de tamaño siempre debe ser con un ancho y una altura proporcionales. ¿Cómo puedo implementar esto? Ya tengo el código para cargar la foto:Redimensionamiento de imagen básico en Ruby on Rails

pic.rb < - modelo

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 < - vista

<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 %> 

Gracias

Respuesta

25

Puede cambiar el tamaño con la gema RMagick.

Esto es sólo un ejemplo, que puede adaptarse:

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") 
} 

Más información aquí: http://www.imagemagick.org/script/api.php#ruby

3

He intentado seguir. Funciona bien. Espero que ayude a alguien.

1.Add siguiente joya en Gemfile:

gem "ImageResize", "~> 0.0.5" 

2.run haz

3.use esto en función del controlador:

require 'rubygems' 
require 'ImageResize' 

#input_image_filename, output_image_filename, max_width, max_height 
Image.resize('big.jpg', 'small.jpg', 40, 40) 
+3

Nota: requiere Java – robd

1

Hay una gema llamada "Refile". Eso es genial. Siga y consulte este tutorial sobre cómo usarlo. https://gorails.com/episodes/file-uploads-with-refile aquí es cómo hacerlo.

Agregar a su joya el archivo

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

Crear un campo de tabla utilizando la migración rieles en su mesa como image_id de type.Now cadena viene cómo insertar en ese campo y mostrar la imagen.

Use esto en su formulario de carga, en gran parte form_for do | f |

<%= f.attachment_field :image %> 

si está utilizando los rieles 4 asegúrese de pasar los parámetros de los rieles fuertes.

Pon esto en tu modelo.archivo rb donde está almacenando la imagen (debajo del nombre de modelo de clase)

attachment :image 

muestra la imagen es simple.

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

acaba de editar mi post. @MamounBenghezal –